题目来源: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; //分子或分母中有一个的最大公约数不是1return 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; //偶数次循环,第一行的数为左边一个数加1for (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; //奇数次循环,第一行的数为上边一个数加1for (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 };
bool flag = true; //循环结束标志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设为6for (int year = 2000; year <= 2020 && flag == true; year++) //年份{IsLeapYear(year); //判断该年是否为闰年for (int month = 1; month <= 12 && flag == true; month++) //月份{for (int day = 1; day <= days[month - 1] && flag == true; day++) //天数{if (year == 2020 && month == 10 && day > 1) //2020年10月2日{flag = false; //循环结束break;}if (count == 1 || day == 1 || count == 1 && day == 1) miles = miles + 2; //满足条件时跑2kmelse miles = miles + 1; //其余情况跑1kmif (count % 7 == 0) count = 1; //每周一循环else count++; //count用来判断该天是周几}}}cout << "这段时间小蓝总共跑步" << miles << "千米";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型的回文日期各是哪一天。
#include <iostream>
#include<string>
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()
{string date; //将输入的日期设置为字符串cout << "Please enter the date:";cin >> date;int a, b, c;a = (date[0] - '0') * 1000 + (date[1] - '0') * 100 + (date[2] - '0') * 10 + (date[3] - '0'); //提取输入日期中的年份if (date[4] == '0') b = date[5] - '0'; //提取输入日期中的月份else b = (date[4] - '0') * 10 + (date[5] - '0');if (date[6] == '0') c = date[7] - '0'; //提取输入日期中月份的天数else c = (date[6] - '0') * 10 + (date[7] - '0');bool find1 = false, find2 = false; //设置两个布尔类型,表示回文日期和ABABBABA型的回文日期是否找到for (int year = a; find1 == false || find2 == false; year++) //年{IsLeapYear(year); //判断该年是否为闰年for (int month = 1; month <= 12 && (find1 == false || find2 == false); month++) //月{if (year == a && month < b) break; //要从输入日期的后一天开始判断for (int day = 1; day <= days[month - 1] && (find1 == false || find2 == false); day++) //日{if (year == a && month < b && day < c) break; //要从输入日期的后一天开始判断//使用三目运算符进行判断,将整型的数字拼接成“yyyymmdd”格式的字符串string str = to_string(year) + (to_string(month).size() == 2 ? to_string(month) : "0" + to_string(month)) + (to_string(day).size() == 2 ? to_string(day) : "0" + to_string(day));for (int i = 0; i < 4; i++) //寻找输入日期后的第一个回文日期{if (find1 == true || (find1 == false && str[i] != str[7 - i])) break; //不满足回文日期条件时,天数往后推一天if (i == 3) //满足回文日期的条件{find1 = true; //找到了回文日期cout << str << endl;}}for (int i = 0; i < 4; i++) //寻找输入日期后的第一个ABABBABA型回文日期{if (find2 == true || (find2 == false && (str[i] != str[7 - i] || str[0] != str[2] || str[1] != str[3]))) break; //不满足ABABBABA型回文日期条件时,天数往后推一天if (i == 3) //满足ABABBABA型回文日期的条件{find2 = true; //找到了ABABBABA型回文日期cout << str;}}}}}return 0;
}