- REPEAT程序 题目描述: 附件 prog.txt 中是一个用某种语言写的程序。其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。 例如如下片段: REPEAT 2; A=A+4; REPEAT 5; REPEAT 6; A=A+5; A=A+7; A=A+8; A=A+9; 该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。 REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。 A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。 请问该程序执行完毕之后,A 的值是多少? 题目分析: 从题目中看出REPEAT就是一个for循环,后面的数字就是循环次数,循环控制的范围由缩进表达。然后模拟出题就可以
#include using namespace std;
int main(){ int A=0;
for(int i=0;i<2;i++){
A+=4;
for(int j=0;j<5;j++){
for(int k=0;k<6;k++){
A+=5;
}
A+=7;
}
A+=8;
}
A+=9;
cout<<"A = "<<A<<endl;
}
- 猜生日 题目描述: 今年的植树节(2012年3月 12日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!” “把我出生的年月日连起来拼成一个8位数(月、日不足两位前补0)正好可以被今天的年、月、日整除!” 他想了想,又补充到:“再给个提示,我是6月出生的。”根据这些信息,请你帮小明算一下,他叔叔的出生年月日。 格式是年月日连成的8位数。例如,如果是1948年6月12日,就写:19480612。
#include using namespace std; int main() { // 请在此输入您的代码 for(int i=19000101;i<=20120312;i++){ if(i%2012==0&&i%3==0&&i%12==0&&i/100%100==6&&i%100<32){ cout<<i; break; } } return 0; } 3. 成绩统计 题目描述: 小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。 【输入格式】 输入的第一行包含一个整数n,表示考试人数。接下来n行,每行包含一个0至100的整数,表示一个学生的得分。 【输出格式】 输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。
#include using namespace std;
int main(){ int n,bad=0,good=0,b,f; cin>>n; int a[n]; for(int i=0;i<n;i++){ cin>>a[i]; if(a[i]>=85){ good++; } if(a[i]>=60){ bad++; }
}
b=bad*100.0/n*1.0+0.5;
f=good*100.0/n*1.0+0.5;
cout<<b<<"%"<<endl;
cout<<f<<"%"<<endl;
}
- 乘积尾零 题目描述: 如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 1486 5722 3135 1170 4014 5510 5120 729 2880 9019 2049 698 4582 4346 4427 646 9742 7340 1230 7683 5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 6701 6645 1671 5978 2704 9926 295 3125 3878 6785 2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 689 5510 8243 6114 337 4096 8199 7313 3685 211
#include #include using namespace std; int main() { // 请在此输入您的代码 int a[100]={5650,4542,3554,473,946,4114,3871,9073,90,4329,2758,7949,6113,5659,5245,7432,3051,4434,6704,3594,9937,1173,6866,3397,4759,7557,3070,2287,1453,9899,1486,5722,3135,1170,4014,5510,5120,729,2880,9019,2049,698,4582,4346,4427,646,9742,7340,1230,7683,5693,7015,6887,7381,4172,4341,2909,2027,7355,5649,6701,6645,1671,5978,2704,9926,295,3125,3878,6785,2066,4247,4800,1578,6652,4616,1113,6205,3264,2915,3966,5291,2904,1285,2193,1428,2265,8730,9436,7074,689,5510,8243,6114,337,4096,8199,7313,3685,211}; int cnt2=0,cnt5=0; for(int i=0;i<=99;i++){ int t=a[i]; while(t%2==0){ cnt2++; t/=2; } while(t%5==0){ cnt5++; t/=5; } } cout<<min(cnt2,cnt5)<<endl; return 0; }
- 等差数列 题目描述: 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给出这N个整数,小明想知道包含这N个整数的最短的等差数列有几项? 【输入描述】 输入的第一行包含一个整数 N。第二行包含N个整数A1,A2…An 。(注意并不一定是按等差数列中的顺序给出) 输出一个整数表示答案。 #include #include using namespace std; int main() { // 请在此输入您的代码 int n,min=10000; cin>>n; long long a[n]; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); for(int j=0;j<n-1;j++){ if(a[j+1]-a[j]<min){ min=a[j+1]-a[j]; } } int m=(a[n-1]-a[0])/min; if(min==0) cout<<n; else cout<<m+1; return 0; }
- 合并检测 题目描述: 新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情, A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人( k 个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k 个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k?1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k+1 个试剂盒完成了 k 个人的检测。 A 国估计被测的民众的感染率大概是 1,呈均匀分布。请问 k 取多少能最节省试剂盒? 题目分析: 这里概率为1,我们不妨设置测试人员为100,然后就是分类讨论k可以被100整除和不可以被整除的情况 可以被100整除 100/k+k 不可以被100整除 100/k+k+1 #include using namespace std;
int main(){ int k,sum,j,s=1000,min,m,f; for(k=1;k<=100;k++){ if(100%k==0){ j=100/k; sum=j+k; if(sum<s){ min=sum; s=sum; f=k; } } else{ j=100/k; sum=j+1+k; if(sum<s){ min=sum; s=sum; f=k; } } } cout<<"最少需要试剂 "<<min<<" 盒,此时以 "<<f<<" 人为一个采集标本"; }
- 回文日期 题目描述: 2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd”的格式写成一个8位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202即2021年12月2日。也有人表示20200202并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100年后就能遇到下一个ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。 【输入格式】 输入包含一个八位整数N,表示日期。 【输出格式】 输出两行,每行1个八位数。第一行表示下一个回文日期,第二行表示下一个ABABBABA型的回文日期。 #include using namespace std;
int leap(int year){ if((year%4==0&&year%100!=0)||year%400==0) return 1; }
int palindromic(int num){ int m,m1,m2,m3,m4,m5,m6,m7,m8; m1=(num%10)*10000000; m2=(num/10%10)*1000000; m3=(num/100%10)*100000; m4=(num/1000%10)*10000; m5=(num/10000%10)*1000; m6=(num/100000%10)*100; m7=(num/1000000%10)*10; m8=num/10000000; m=m1+m2+m3+m4+m5+m6+m7+m8; if(num==m) return 1; else return 0; }
int main(){
int monthes[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int year,month,day,n,year0,month0,day0,n1,n2,n3,n4,n5,n6,n7,n8,m,m1,m2,m3,m4,m5,m6,m7,m8,k1,k2,k3,k4,k5,k6,k7,k8;
int num;
cin>>num;
if(!palindromic(num)) return 0;
n1=(num/10000000)*1000;
n2=(num/1000000%10)*100;
n3=(num/100000%10)*10;
n4=(num/10000%10);
n5=(num/1000%10)*10;
n6=(num/100%10);
n7=(num/10%10)*10;
n8=(num%10);
year0=n1+n2+n3+n4;
month0=n5+n6;
day0=n7+n8;
for(year=year0;year<10000;year++){
if(leap(year)==1) monthes[2]=29;
else monthes[2]=28;
for(month=month0;month<13;month++){
for(day=day0+1;day<monthes[month];day++){
n=year*10000+month*100+day;
m1=(day%10)*10000000;
m2=(day/10)*1000000;
m3=(month%10)*100000;
m4=(month/10)*10000;
m5=(year%10)*1000;
m6=(year/10%10)*100;
m7=(year/100%10)*10;
m8=year/1000;
k1=(day%10);
k2=(day/10);
k3=(month%10);
k4=(month/10);
k5=(year%10);
k6=(year/10%10);
k7=(year/100%10);
k8=year/1000;
m=m1+m2+m3+m4+m5+m6+m7+m8;
if((n==m)&&(k8==k1)&&(k6==k1)&&(k3==k1)&&(k7==k2)&&(k5==k2)&&(k4==k2)) {
cout<<n<<endl;
return 0;
}
}
}
}
} 8. 纪念日 题目描述: 2020 年 7 月 1 日是中国 共 产 党 成立 99 周年纪念日。 中国 共 产 党 成立于 1921 年 7 月 23 日。 请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟? 题目分析: 先计算1922年到2020 年一共多少天,然后减去多余的天数 #include using namespace std;
int main(){ int i,j,flag,sum=0;
for(i=1922;i<=2020;i++){
if((i%4==0&&i%100!=0) || i%400==0) {
sum+=366;
}
else sum+=365;
}
sum-=22;
cout<<sum*24*60;
} 9. 既约分数 题目描述: 如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4,5/2,1/8,7/1都是既约分数。 请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020) 题目分析: 暴力搜索,通过最大公约数判断 #include using namespace std;
int panduan(int a,int b) { int c; if(a==1&&b==1) return 1; if(a>=b){ while(c=a%b){ a=b; b=c; } if(b==1) return 1; else return 0; } else{ while(c=b%a){ b=a; a=c; } if(a==1) return 1; else return 0; } } int main(){ int sum=0; for(int i=1;i<=2020;i++){ for(int j=1;j<=2020;j++){ sum+=panduan(i,j); } } cout<<sum<<endl; cout<<panduan(2,21); }
- 门牌制作 题目描述: 小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。 请问要制作所有的1到2020号门牌,总共需要多少个字符2? #include using namespace std;
int panduan(int num){ int sum=0; while(num){ if(num%10==2){ sum++; } num=num/10; } return sum; }
int main(){ int n; for(int i=0;i<=2020;i++){ n+=panduan(i); } cout<<n; }