题目来源:2020年真题题集(B组)
注:代码都是自己写的,不是参考答案!
目录
- 1. 门牌制作
- 运行结果
- 2. 既约分数
- 运行结果
- 3. 蛇形填数
- 运行结果
- 4. 跑步锻炼
- 运行结果
- 5. 7段码
- 6. 成绩统计
- 运行结果
- 7. 回文日期
1. 门牌制作
题目描述:小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
#include<stdio.h>
int main()
{
int count = 0,n;
for (int num = 1; num <= 2020; num++)
{
n = num;
while (n > 0)
{
if (n % 10 == 2) count++;
n /= 10;
}
}
printf("要制作所有的1到2020号门牌,总共需要%d个字符2", count);
return 0;
}
运行结果
2. 既约分数
题目描述:如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如 1/7 , 3/4 , 1/8 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1和 2020)?
#include<iostream>
using namespace std;
bool check(int m, int n)
{
for (int i = 2; i <= 2020; i++)
if (m % i == 0 && n % i == 0) return false; //分子或分母中有一个的最大公约数不是1
return true;
}
int main()
{
int count = 0;
for (int i = 1; i <= 2020; i++)
for (int j = 1; j <= 2020; j++)
if (check(i, j)) count++;
cout << "分子和分母都是1到2020之间的整数中有" << count << "个既约分数" ;
return 0;
}
运行结果
3. 蛇形填数
题目描述: 如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?
1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …
#include<stdio.h>
int main()
{
int arr[50][50] = { 0 }, i, j, m, n;
arr[1][1] = 1;
for (i = 2; i <= 40; i++)
{
if (i % 2 == 0) //偶数次循环的话,斜向下累加
{
m = 1; n = i;
arr[1][i] = arr[1][i - 1] + 1; //偶数次循环,第一行的数为左边一个数加1
for (j = 1; j < i; j++)
arr[++m][--n] = arr[m - 1][n + 1] + 1; //从第二行开始斜向下累加
}
else //奇数次循环的话,斜向上累加
{
m = i; n = 1;
arr[i][1] = arr[i - 1][1] + 1; //奇数次循环,第一行的数为上边一个数加1
for (j = 1; j < i; j++)
arr[--m][++n] = arr[m + 1][n - 1] + 1; //从第二列开始斜向上累加
}
}
printf("矩阵中第20行第20列的数是:%d", arr[20][20]);
return 0;
}
运行结果
arr[1][1]=1²+0²
arr[2][2]=2²+1²
arr[3][3]=3²+2²
…arr[20][20]=20²+19²
4. 跑步锻炼
题目描述:小蓝每天都锻炼身体。正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多少千米?
#include <iostream>
using namespace std;
int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
void IsLeapYear(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) days[1] = 29; //闰年29天
else days[1] = 28; //平年28天
}
int main()
{
int miles = 0, count = 6; //2000年1月1日为周六,因此count设为6
for (int year = 2000; year <= 2020; year++) //年份
{
IsLeapYear(year); //判断该年是否为闰年
for (int month = 1; month <= 12; month++) //月份
{
for (int day = 1; day <= days[month - 1]; day++) //天数
{
if (count == 1 || day == 1 || count == 1 && day == 1) miles = miles + 2; //满足条件时跑2km
else miles = miles + 1; //其余情况跑1km
if (count % 7 == 0) count = 1; //每周一循环
else count++; //count用来判断该天是周几
}
}
}
cout << "这段时间小蓝总共跑步" << miles - 106 << "千米"; //减去2020年多余的数量
return 0;
}
运行结果
5. 7段码
题目描述:小蓝要用七段码数码管来表示一种特殊的文字。 七段码上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。 请问,小蓝可以用七段码数码管表达多少种不同的字符?
6. 成绩统计
题目描述:小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
#include<stdio.h>
#include<math.h>
int main()
{
int student, arr[2] = {0},rate[2];
float score;
printf("Please input the student number:");
scanf_s("%d", &student);
printf("Please enter the student scores:\n");
for (int i = 0; i < student; i++)
{
scanf_s("%f", &score);
if (score >= 85) arr[0]++; //统计"优秀"的人数
if (score >= 60) arr[1]++; //统计"及格"的人数
}
rate[1] = (round)((float)arr[1] / student * 100); //及格率
rate[0] = (round)((float)arr[0] / student * 100); //优秀率
printf("%d%% %d%%", rate[1],rate[0]);
}
运行结果
7. 回文日期
2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd”的格式写成一个8位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202即2021年12月2日。也有人表示20200202并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100年后就能遇到下一个ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。