C++ の演習
1. 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) であり、この 2 つはスペースで区切られています。
次の 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. 整数の再構成
正の整数が与えられた場合、それを最大値と最小値に再結合し、2 つの数値の差を求めます。例: 3721、再構築できる最大数は 7321、最小数は 1237、2 つの数値の差は 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 であり、長方形の入力シーケンスと一致します。
説明を入力してください
最初の行には、長方形の数を示す 100 未満の正の整数を入力します。
次の n 行には、各行に長方形の長さと幅 (両方とも正の整数) を 1 つのスペースで区切って入力します。
出力の説明
n 個の正方形のシーケンス番号を出力します。各長方形は 1 行を占めます。
ユースケース入力 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 関心グループの各生徒の誕生日を知っており、グループのメンバーを最年長から最年少の年齢順に並べ替えるプログラムを作成したいと考えています。しかし、Xiao Tong のプログラミングのレベルは非常に高く、彼は長い間忙しかったのに、自分のアイデアを実現できませんでした。小さなプログラミングの専門家として、彼が分類を完了するのを手伝ってください。
説明を入力してください
入力には n+1 行があり、最初の行は CSP 関心グループの総数 n で、2 行目から
n+1 行目は各人の名前 s、誕生年 y、月 m、日 d です。
1<n<100。年、月、日が実際に存在し、1990 年から 2022 年の範囲内であることを確認してください。1990 年と 2022 年を含む。
出力の説明
合計 n 行、つまり誕生日が古い順に n 人のクラスメートの名前を出力します。(同じ誕生日の生徒が2人いる場合は、入力が遅い生徒が先に出力します)。
ユースケース入力 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 人で、各有権者は 1 人の候補者にのみ投票できます。n人の有権者の投票を入力し、3人の候補者の投票結果を出力します。要件: 構造を使用して問題を解決します。
説明を入力してください
行 1 は正の整数 n です。(10 ≤ n ≤ 100)
2 行目は n 個の文字列です。各文字列は候補者の姓です。
出力の説明
全部で3行あります。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()=='\n'){
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 の 3 つの情報を持っています。ID は 10 文字未満の文字列です。各患者の ID は異なり、数字と文字のみが含まれます。
順番待ちのルールは次のとおりです。
1. 高齢者(60 歳以上)は、高齢者以外の人々よりも優先的に診察を受けます。
2. 高齢者は年齢の高い順に受診し、同年齢の人は登録順に並びます。
3. 高齢者以外の方は登録順に受診します。
説明を入力してください
1 行目に患者数を示す 100 未満の正の整数を入力します。
患者登録の順序に従い、各行に患者 ID と年齢をスペースで区切って入力します。
患者の登録順序番号は 1 ~ n であり、患者の入力順序と一致しています。
出力の説明
ルールによってソートされた患者 ID (1 行に 1 つ)。
ユースケース入力 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;
}
}