C++練習(xí)題
1、計(jì)算某個(gè)月有多少天
題目:從鍵盤輸入年份和月份,輸出這個(gè)月的天數(shù)。
【樣例輸入】2023 1
【樣例輸出】31
【樣例輸入】2020 2
【樣例輸出】29
提示:當(dāng)輸入的月份為2月份時(shí),需要判斷該年年份是否為閏年。
判斷閏年的條件:年份為4的倍數(shù)并且不是100的倍數(shù),或者年份是400的倍數(shù)。
int main(){
int year,month,day=0;
cout<<"請(qǐng)輸入年份和月份,以空格分隔:";
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之間的質(zhì)數(shù)。
在控制臺(tái)打印輸出1-200之間所有的質(zhì)數(shù),以空格分割。
提示:只有1和這個(gè)數(shù)本身能被它自己整除的數(shù)就是質(zhì)數(shù)。
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、計(jì)算矩陣邊緣元素之和
輸入一個(gè)整數(shù)矩陣,計(jì)算位于矩陣邊緣的元素之和。所謂矩陣邊緣的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
輸入描述
第一行分別為矩陣的行數(shù)m和列數(shù)n(m<100,n<100),兩者之間以一個(gè)空格分開。
接下來輸入的m行數(shù)據(jù)中,每行包含n個(gè)整數(shù),整數(shù)之間以一個(gè)空格分開。
輸出描述
輸出對(duì)應(yīng)矩陣的邊緣元素和。
用例輸入 1文章來源:http://www.zghlxwxcb.cn/news/detail-463963.html
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、判斷數(shù)字位數(shù)
編寫一個(gè)函數(shù)get_length(…),計(jì)算輸入的正整數(shù)有多少位。
輸入描述
一個(gè)正整數(shù)(不超過10位)。
輸出描述
一個(gè)整數(shù),表示輸入的正整數(shù)的位數(shù)
用例輸入 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){
//正整數(shù)的位數(shù)最少也有1位,所以初始值賦值為1
int i=1;
while(n/10!=0){
n/=10;
i++;
}
return i;
}
5、整數(shù)重組
任意給定一個(gè)正整數(shù),把它重新組成一個(gè)最大值和一個(gè)最小值,求出兩數(shù)的差。例如:3721,可以重新組成的最大數(shù)為7321,組成的最小數(shù)為1237,兩數(shù)之差為7321-1237=6084。
輸入描述
x(整數(shù)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++;
}
//對(duì)數(shù)組元素升序排序
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;
}
}
}
//返回整數(shù)的位數(shù)
return i;
}
int main()
{
int n;
cin>>n;
int a[100]={};
//統(tǒng)計(jì)輸入數(shù)字的位數(shù),并將所有數(shù)位上的數(shù)以升序存到數(shù)組a中
int count=X(a,n);
int max=0,min=0;
int x=1,y=1;
//最小值則以數(shù)組元素從前往后結(jié)合,最大值則以數(shù)組元素從后往前結(jié)合
for(int i=0,j=count-1;i<count;i++,j--){
//最小值從前往后遍歷,最大值從后往前遍歷
//從個(gè)位開始,依次用數(shù)位上的數(shù)字x1,x10,x100,......
min+=a[i]*x;
x*=10;
max+=a[j]*y;
y*=10;
}
cout<<max-min;
}
6、冰雹猜想
冰雹猜想:它首先流傳于美國,不久傳到歐洲,后來由一位叫角谷的日本人帶到亞洲。通俗地講,冰雹猜想的內(nèi)容是這樣的:任意給定一個(gè)自然數(shù)n,當(dāng)n是偶數(shù)時(shí),將它除以2,即將它變成n/2;當(dāng)n是奇數(shù)時(shí),就將它變成3n+1,……,若干步后,總會(huì)得到1。
在上述演變過程中,將每一次出現(xiàn)的數(shù)字排列起來,就會(huì)出現(xiàn)一個(gè)數(shù)字序列。
我們現(xiàn)在要解決的問題是:對(duì)于給定的n,求出數(shù)字序列中第一次出現(xiàn)1的位置。
輸入描述
輸入一個(gè)自然數(shù)n。輸出序列中第一次出現(xiàn)1的位置。
輸出描述
輸出序列中第一次出現(xiàn)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、長方形比大小
長方形家族有個(gè)很俗氣的傳統(tǒng):誰大誰優(yōu)先。 “比大小”的規(guī)則是:
- 面積大的優(yōu)先
- 面積相同時(shí),周長長的優(yōu)先
請(qǐng)將n個(gè)長方形按“比大小”的規(guī)則排序后,輸出每個(gè)長方形的序號(hào)。長方形的序號(hào)是1~n,和長方形的輸入順序一致。
輸入描述
第1行,輸入一個(gè)小于100的正整數(shù),表示長方形的個(gè)數(shù);
接下來的n行,每行輸入一個(gè)長方形的長和寬(都是正整數(shù)),中間用單個(gè)空格隔開。
輸出描述
輸出n個(gè)正方形的序號(hào)。每個(gè)長方形占一行。
用例輸入 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興趣小組中每個(gè)同學(xué)的生日,想編程將小組成員按照年齡從大到小的順序排序。但是小童編程水平很菜,忙活了半天都沒有實(shí)現(xiàn)自己的想法。請(qǐng)身為編程小能手的你,幫他完成排序。
輸入描述
輸入共有 n+1 行,第 1 行為 CSP興趣小組總?cè)藬?shù) n;
第 2 行至第 n+1 行分別是每個(gè)人的姓名 s、出生年 y、月 m、日 d。
1<n<100。保證年月日實(shí)際存在,且年份在1990~2022范圍內(nèi)。包括1990和2022。
輸出描述
輸出共有 n 行,即 n 個(gè)生日從大到小同學(xué)的姓名。(如果有兩個(gè)同學(xué)生日相同,輸入靠后的同學(xué)先輸出)。
用例輸入 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個(gè)候選人:姓氏分別是“l(fā)i”、“zhang”、“sun”。有n個(gè)選民,每個(gè)選民只能投票選擇一個(gè)候選人。輸入n個(gè)選民的選票,輸出3個(gè)候選人各自的得票結(jié)果。要求:使用結(jié)構(gòu)體解題。
輸入描述
第1行是一個(gè)正整數(shù)n。(10 ≤ n ≤ 100)
第2行是n個(gè)字符串。每個(gè)字符串都是一個(gè)候選人的姓氏。
輸出描述
共3行。按“l(fā)i”、“zhang”、“sun”的順序輸出3個(gè)候選人的得票情況,格式是“姓氏:得票數(shù)”。
用例輸入 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個(gè)選民的投票情況保存到數(shù)組中
while(cin >> c[i])
{
i++;
if(cin.get()=='\n'){
break;
}
}
//遍歷數(shù)組,和結(jié)構(gòu)體數(shù)據(jù)比較,如果姓氏相同,則候選人票數(shù)增加
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、病人排隊(duì)
請(qǐng)編寫一個(gè)病人排隊(duì)看病的程序。
病人有登記序號(hào)、年齡和ID三個(gè)信息。ID是一個(gè)長度小于10的字符串,每個(gè)病人的ID各不相同且只含數(shù)字和字母。
排隊(duì)規(guī)則是:
1.老年人(年齡 ≥ 60歲)比非老年人優(yōu)先看病。
2.老年人按年齡從大到小的順序看病,年齡相同的按登記的先后順序排序。
3.非老年人按登記的先后順序看病。
輸入描述
第1行,輸入一個(gè)小于100的正整數(shù),表示病人的個(gè)數(shù);
后面按照病人登記的先后順序,每行輸入一個(gè)病人的ID和年齡,中間用單個(gè)空格隔開。
病人的登記序號(hào)是1~n,和病人的輸入順序一致。
輸出描述
按規(guī)則排序后的病人ID,每行一個(gè)。
用例輸入 1
5
021075 40
004003 15
010158 67
021033 75
102012 30
用例輸出 1文章來源地址http://www.zghlxwxcb.cn/news/detail-463963.html
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;
}
}
到了這里,關(guān)于C語言/C++練習(xí)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!