A. 门牌制作 (5分)
【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、 0、 1、 7,即需要 1 个
字符 0, 2 个字符 1, 1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
Ans:624(签到题)
#include <bits/stdc++.h>
using namespace std;
signed main()
{
int res = 0;
for(int i = 1 ; i <= 2020; i ++){
int tmp = i;
while(tmp){
res += (tmp%10 == 2);
tmp /= 10;
}
}
cout<<res<<endl;
return 0;
}
B. 既约分数
【问题描述】
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。 例如,3 4 , 5 2 , 1 8 , 7 1 都是既约分数。 请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
Ans:2481215(签到题again)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int gcd(int x,int y){
if(x < y) swap(x,y);
return y == 0 ? x : gcd(y,x%y);
}
signed main()
{
int res = 0;
for(int i =1 ; i <= 2020 ; i ++){
for(int j = 1 ; j <= 2020 ; j++){
res += gcd(i,j) == 1;
}
}
cout<<res<<endl;
return 0;
}
C. 蛇形填数 (10 分)
【问题描述】
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
在这里插入图片描述
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列 的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
Ans:761 (模拟,开二维数组按规律填数字就好了。)
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int a[200][200];
int i = 0; // row
int j = 0; // column
int cnt = 1;
int flag = 1; // direction
while(cnt < 40*40){
a[i][j] = cnt;
i -= flag;
j += flag;
if(flag == 1 && i == -1){
i = 0;
flag = -1;
}
else if(flag == -1 && j == -1){
j = 0;
flag = 1;
}
++ cnt;
}
cout<<a[19][19]<<endl;
return 0;
}
D.跑步锻炼
【问题描述】
小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了 激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。 小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
Ans:8879 (简单模拟,模拟天数一天一天增加,判断是否周一或月初)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int days[]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
int check(int y,int m){
// leap year
return m == 2 && (y%400 == 0|| (y%4 == 0 && y%100 != 0));
}
signed main()
{
int y = 2000;
int m = 1;
int d = 1;
int yy = 2020;
int mm = 10;
int dd = 1;
int week = 6-1;
int res = 0;
for( ; y <= yy ; y ++){
int lim1 = (y == yy) ? mm : 12;
for( ; m <= lim1; m ++){
int lim2 = (y == yy && m