您现在的位置是:首页 >技术教程 >C语言/C++练习题网站首页技术教程

C语言/C++练习题

toMontain 2024-07-04 11:18:06
简介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、长方形比大小

长方形家族有个很俗气的传统:谁大谁优先。 “比大小”的规则是:

  1. 面积大的优先
  2. 面积相同时,周长长的优先

请将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;
	} 
 } 
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。