您现在的位置是:首页 >技术教程 >C语言/C++练习题网站首页技术教程
C语言/C++练习题
C++练习题
1、计算某个月有多少天
题目:从键盘输入年份和月份,输出这个月的天数。
【样例输入】2023 1
【样例输出】31
【样例输入】2020 2
【样例输出】29
提示:当输入的月份为2月份时,需要判断该年年份是否为闰年。
判断闰年的条件:年份为4的倍数并且不是100的倍数,或者年份是400的倍数。
int main(){
int year,month,day=0;
cout<<"请输入年份和月份,以空格分隔:";
cin>>year>>month;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day=31;break;
case 4:
case 6:
case 9:
case 11:day=30;break;
case 2:
if(year%4==0&&year%100!=0||year%400==0){
day=29;
}else{
day=28;
}
break;
default:cout<<"月份输入有误。";
}
if(day!=0){
cout<<year<<"年"<<month<<"月有"<<day<<"天";
}
}
2、输出1-200之间的质数。
在控制台打印输出1-200之间所有的质数,以空格分割。
提示:只有1和这个数本身能被它自己整除的数就是质数。
int main(){
bool flag;
for(int i=2;i<=200;i++){
flag=false;
for(int j=2;j<i;j++){
if(i%j==0){
flag=true;
break;
}
}
if(!flag){
cout<<i<<" ";
}
}
}
3、计算矩阵边缘元素之和
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入描述
第一行分别为矩阵的行数m和列数n(m<100,n<100),两者之间以一个空格分开。
接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。
输出描述
输出对应矩阵的边缘元素和。
用例输入 1
3 3
3 4 1
3 7 1
2 0 1
用例输出 1
15
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>m>>n;
int arr[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>arr[i][j];
}
}
int sum=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0||i==m-1){
sum+=arr[i][j];
}else if(j==0||j==n-1){
sum+=arr[i][j];
}
}
}
cout<<sum;
}
4、判断数字位数
编写一个函数get_length(…),计算输入的正整数有多少位。
输入描述
一个正整数(不超过10位)。
输出描述
一个整数,表示输入的正整数的位数
用例输入 1
123456
用例输出 1
6
#include<iostream>
using namespace std;
int get_length(int n);
int main()
{
int n;
cin>>n;
cout<<get_length(n);
}
int get_length(int n){
//正整数的位数最少也有1位,所以初始值赋值为1
int i=1;
while(n/10!=0){
n/=10;
i++;
}
return i;
}
5、整数重组
任意给定一个正整数,把它重新组成一个最大值和一个最小值,求出两数的差。例如:3721,可以重新组成的最大数为7321,组成的最小数为1237,两数之差为7321-1237=6084。
输入描述
x(整数1≤x≤100000)
输出描述
最大值和最小值的差
用例输入 1
3721
用例输出 1
6084
#include<iostream>
using namespace std;
int X(int *a,int n){
int i=0;
while(n!=0){
a[i]=n%10;
n=n/10;
i++;
}
//对数组元素升序排序
for(int k=0;k<i;k++){
for(int j=0;j<k;j++){
if(a[k]>a[j]){
int t=a[k];
a[k]=a[j];
a[j]=t;
}
}
}
//返回整数的位数
return i;
}
int main()
{
int n;
cin>>n;
int a[100]={};
//统计输入数字的位数,并将所有数位上的数以升序存到数组a中
int count=X(a,n);
int max=0,min=0;
int x=1,y=1;
//最小值则以数组元素从前往后结合,最大值则以数组元素从后往前结合
for(int i=0,j=count-1;i<count;i++,j--){
//最小值从前往后遍历,最大值从后往前遍历
//从个位开始,依次用数位上的数字x1,x10,x100,......
min+=a[i]*x;
x*=10;
max+=a[j]*y;
y*=10;
}
cout<<max-min;
}
6、冰雹猜想
冰雹猜想:它首先流传于美国,不久传到欧洲,后来由一位叫角谷的日本人带到亚洲。通俗地讲,冰雹猜想的内容是这样的:任意给定一个自然数n,当n是偶数时,将它除以2,即将它变成n/2;当n是奇数时,就将它变成3n+1,……,若干步后,总会得到1。
在上述演变过程中,将每一次出现的数字排列起来,就会出现一个数字序列。
我们现在要解决的问题是:对于给定的n,求出数字序列中第一次出现1的位置。
输入描述
输入一个自然数n。输出序列中第一次出现1的位置。
输出描述
输出序列中第一次出现1的位置。
用例输入 1
6
用例输出 1
9
#include<iostream>
using namespace std;
int main()
{
long long n;
cin>>n;
long long index=0;
while(true){
index++;
if(n==1){
cout<<index;
break;
}
if(n%2==0){
n=n/2;
}else{
n=3*n+1;
}
}
}
7、长方形比大小
长方形家族有个很俗气的传统:谁大谁优先。 “比大小”的规则是:
- 面积大的优先
- 面积相同时,周长长的优先
请将n个长方形按“比大小”的规则排序后,输出每个长方形的序号。长方形的序号是1~n,和长方形的输入顺序一致。
输入描述
第1行,输入一个小于100的正整数,表示长方形的个数;
接下来的n行,每行输入一个长方形的长和宽(都是正整数),中间用单个空格隔开。
输出描述
输出n个正方形的序号。每个长方形占一行。
用例输入 1
5
9 7
3 4
2 3
2 6
3 21
用例输出 1
5
1
4
2
3
代码:
#include <bits/stdc++.h>
using namespace std;
struct stu{
int a;
int b;
int c;
};
stu s[100];
bool cmp(stu x,stu y){
if(x.a*x.b==y.a*y.b){
return x.a+x.b>y.a+y.b;
}else{
return x.a*x.b>y.a*y.b;
}
}
int main(){
int num;
cin>>num;
for(int i=0;i<num;i++){
cin>>s[i].a>>s[i].b;
s[i].c = i+1;
}
sort(s,s+num,cmp);
for(int i=0;i<num;i++){
cout<<s[i].c<<endl;
}
return 0;
}
8、生日排序
小童知道CSP兴趣小组中每个同学的生日,想编程将小组成员按照年龄从大到小的顺序排序。但是小童编程水平很菜,忙活了半天都没有实现自己的想法。请身为编程小能手的你,帮他完成排序。
输入描述
输入共有 n+1 行,第 1 行为 CSP兴趣小组总人数 n;
第 2 行至第 n+1 行分别是每个人的姓名 s、出生年 y、月 m、日 d。
1<n<100。保证年月日实际存在,且年份在1990~2022范围内。包括1990和2022。
输出描述
输出共有 n 行,即 n 个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)。
用例输入 1
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
用例输出 1
Luowen
Yangchu
Qiujingya
代码:
#include<bits/stdc++.h>
#include<string>
using namespace std;
struct stu{
string name;
int year;
int month;
int day;
};
stu s[100];
bool cmp(stu x,stu y){
if(x.year!=y.year){
return x.year<y.year;
}else{
if(x.month!=y.month){
return x.month<y.month;
}else{
if(x.day!=y.day){
return x.day<y.day;
}else{
return true;
}
}
}
}
int main(){
int num;
cin>>num;
for(int i=0;i<num;i++){
cin>>s[i].name>>s[i].year>>s[i].month>>s[i].day;
}
sort(s,s+num,cmp);
for(int i=0;i<num;i++){
cout<<s[i].name<<endl;
}
return 0;
}
9、候选人投票
有3个候选人:姓氏分别是“li”、“zhang”、“sun”。有n个选民,每个选民只能投票选择一个候选人。输入n个选民的选票,输出3个候选人各自的得票结果。要求:使用结构体解题。
输入描述
第1行是一个正整数n。(10 ≤ n ≤ 100)
第2行是n个字符串。每个字符串都是一个候选人的姓氏。
输出描述
共3行。按“li”、“zhang”、“sun”的顺序输出3个候选人的得票情况,格式是“姓氏:得票数”。
用例输入 1
10
zhang li sun sun li sun sun zhang zhang li
用例输出 1
li:3
zhang:3
sun:4
#include<bits/stdc++.h>
using namespace std;
struct stu{
char name[100];
int num;
};
stu s[100];
int main(){
strcpy(s[0].name,"li");
s[0].num=0;
strcpy(s[1].name, "zhang");
s[1].num=0;
strcpy(s[2].name, "sun");
s[2].num=0;
int n;
cin>>n;
string c[100];
int i=0;
//将n个选民的投票情况保存到数组中
while(cin >> c[i])
{
i++;
if(cin.get()=='
'){
break;
}
}
//遍历数组,和结构体数据比较,如果姓氏相同,则候选人票数增加
for(i=0;i<n;i++){
for(int j=0;j<3;j++){
if(s[j].name==c[i]){
s[j].num+=1;
break;
}
}
}
for(i=0;i<3;i++){
cout<<s[i].name<<":"<<s[i].num<<endl;
}
return 0;
}
10、病人排队
请编写一个病人排队看病的程序。
病人有登记序号、年龄和ID三个信息。ID是一个长度小于10的字符串,每个病人的ID各不相同且只含数字和字母。
排队规则是:
1.老年人(年龄 ≥ 60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。
输入描述
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的ID和年龄,中间用单个空格隔开。
病人的登记序号是1~n,和病人的输入顺序一致。
输出描述
按规则排序后的病人ID,每行一个。
用例输入 1
5
021075 40
004003 15
010158 67
021033 75
102012 30
用例输出 1
021033
010158
021075
004003
102012
#include<iostream>
#include <bits/stdc++.h>
using namespace std;
struct s{
char id[21];
int age;
int I;
};
s stu[100];
s old[100];
s young[100];
bool cmp_o(s x,s y){
if(x.age==y.age){
return x.I<y.I;
}else{
return x.age>y.age;
}
}
bool cmp_y(s x,s y){
return x.I<y.I;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>stu[i].id>>stu[i].age;
stu[i].I=i;
cin.get();
}
int j=0,k=0;
for(int i=0;i<n;i++){
if(stu[i].age>=60){
old[j++]=stu[i];
}else{
young[k++]=stu[i];
}
}
//排序
sort(old,old+j,cmp_o);
sort(young,young+k,cmp_y);
for(int i=0;i<j;i++){
cout<<old[i].id<<endl;
}
for(int i=0;i<=k;i++){
cout<<young[i].id<<endl;
}
}