试题 A: 门牌制作
本题总分:5 分
【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个
字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【参考答案】
624
【参考代码】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,i,j,sum=0;
for(i=1;i<=2020;i++){//从1-2020循环
j=i;
while(j>0){
a=j%10;//每次判断对10取余,就得到个位的数字
j=j/10;//判断完个位的数字,就除以10,继续判断
if(a==2){
sum++;
}
}
}
printf("%d",sum);
return 0;
}
试题 B: 既约分数
本题总分:5 分
【问题描述】
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如,3/4,5/2,1/8,7/1 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1
和 2020)?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【参考答案】
2481215
【参考代码】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a1,b1,a,b,m,sum=0;
for(a=1;a<=2020;a++){
for(b=1;b<=2020;b++){
if(a>b){//判断哪个大,把大的赋值给a1,小的赋值给b1
a1=a;
b1=b;
}else{
a1=b;
b1=a;
}
//求最大公约数
while(b1>0){
m=a1%b1;//大的对小的取余
a1=b1;//小的变成大的
b1=m;//余数变成小的
}//循环取余,最后b1=0,即m=0,此时a1为最大公约数
if(a1==1)sum++;//最大公约数是1,就是不能约分的
}
}
printf("%d",sum);
return 0;
}
附上求最大公约数与最小公倍数的案例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a,b,t,a1,b1,m;
scanf("%d%d",&a,&b);
a1=a;
b1=b;
if(a1<b1){
t=a1;
a1=b1;
b1=t;
}
while(b1>0){//循环取余
m=a1%b1;
a1=b1;
b1=m;
}
printf("%d\n",a1);
printf("%d\n",(a*b)/a1);
return 0;
}
试题 C: 蛇形填数
本题总分:10 分
【问题描述】
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【参考答案】
761
【我的思路】
简便方法:题目只要求求20/20,这个数很特别,是个对角线,通过写几组数据找出对角线的规律:1,5,13,25
5 - 1 = 4
13 - 5 = 8
25 - 13 = 12
…
得出等差数列
答案就来了:
【找规律计算代码】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,t,sum=1;
for(i=0,t=0;i<20;i++,t+=4){
sum+=t;
}
printf("%d",sum);
return 0;
}
实际上真正的按照题目模拟每一次过程
【参考代码】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,t,a[40][40],x=1;
for(i=1;i<40;i++){
if(i%2!=0){//奇数和偶数自上到下还是自下到上的顺序不同
for(t=i,j=1;j<=i;j++,t--){
a[t][j]=x++;//自下到上,行--,列++
}
}else{
for(t=i,j=1;j<=i;j++,t--){
a[j][t]=x++;//自下到上,行++,列--
}
}
}
printf("%d",a[20][20]);
return 0;
}
试题 D: 跑步锻炼
本题总分:10 分
【问题描述】
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了
激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年
10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【参考答案】
8879
【我的思路】
遍历每一年,每个月,每一天进行判断。
【参考代码】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int y,m,d,sum=0,zhou=6;
int a[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(y=2000;y<=2020;y++){//年循环
if((y%4==0&&y%100!=0)||y%400==0){//判断闰年
a[2]=29;
}else{
a[2]=28;
}
for(m=1;m<=12;m++){//月循环
for(d=1;d<=a[m];d++,zhou++){//日循环
sum++;//每天1千米
if(zhou==8){//把周8变成周1
zhou=1;
}
if(d==1||zhou==1){//如果是月初或者周一,再加1千米
sum++;
}
if(y==2020&&m==10&&d==1){//截止到2020.10.1
printf("%d\n",sum);
break;
}
}
}
}
return 0;
}
试题 F: 成绩统计
时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是
一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分
四舍五入保留整数。
【样例输入】
7
80
92
56
74
88
100
0
【样例输出】
71%
43%
试题F: 成绩统计 7第十一届蓝桥杯大赛软件类省赛第二场 C/C++ 大学 B 组
【样例输出】
71%
43%
【我的思路】
输入即判断,最后转换float计算(为了四舍五入)
【参考代码】
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,x,n,pass=0,good=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&x);
if(x>=60){
pass++;
if(x>=85){
good++;
}
}
}
printf("%.f",pass*100.0/n);
printf("%%\n");
printf("%.f",good*100.0/n);
printf("%%");
return 0;
}
试题 G: 回文日期
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
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 型的回文日期。
【样例输入】
20200202
【样例输出】
【样例输出】
20211202
21211212
【评测用例规模与约定】
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的
8 位数表示。
【我的思路】
遍历每年每月每天,判断这天是不是回文日期,进而再次判断是不是ABABBABA 型的回文日期。
【参考代码】
#include <stdio.h>
#include <stdlib.h>
//判断是不是回文日期
int huiwen(int y,int m,int d){
int i,a[10];
a[1]=y/1000;
a[2]=y/100%10;
a[3]=y/10%10;
a[4]=y%10;
a[5]=m/10;
a[6]=m%10;
a[7]=d/10;
a[8]=d%10;
for(i=1;i<=4;i++){
if(a[i]!=a[9-i]){
break;
}
}
if(i==5){
return 1;
}else{
return 0;
}
}
//在回文日期的基础上判断是不是ABABBABA
int niubihuiwen(int y){
int a1=y/1000;
int a2=y/100%10;
int a3=y/10%10;
int a4=y%10;
if(a1==a3&&a2==a4){
return 1;
}else{
return 0;
}
}
int main()
{
int str[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int y,m,d;
int y1,m1,d1;
int all;
scanf("%d",&all);
y=all/10000;
m=all%10000/100;
d=all%100;
//printf("%d %d %d %d\n",all,y,m,d);
int t=0;
for(y1=y;;y1++){//遍历年
for(m1=m;m1<=12;m1++){//遍历月
if((y%4==0&&y%100!=0)||y%400==0){//判断闰年
str[2]=29;
}else{
str[2]=28;
}
for(d1=d+1;d1<=str[m1];d1++){//遍历日
if(huiwen(y1,m1,d1)){
if(t==0){//让第一个回文值只输出一次
printf("%d%02d%02d\n",y1,m1,d1);
t=1;
}
if(niubihuiwen(y1)){
printf("%d%02d%02d\n",y1,m1,d1);
return 0;
}
}
}
d1=1;//日期归1
}
m1=1;//月份归1
}
return 0;
}
评论区