2020第十一届蓝桥杯C/C++ 省赛A组题解

2021-10-18

【问题描述    A】
小蓝要为一条街的住户制作门牌号。
这条街一共有2020位住户,门牌号从1到2020编号。
小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。
请问要制作所有的1到2020号门牌,总共需要多少个字符2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

法一:数学求解

#include<iostream>
using namespace std;

int main() {

	int count1=0,count2 = 0, count3=0,countAll = 0;

	//计算个位数的2(1-9)
	count1 = 1;

	//计算100里面的2的个数(1-99)
	count2 = count1+(10+count1)+8*count1;

	//计算1000里面2的个数(1-999)
	count3 = count2 + (100+count2) + 8 * count2 ;//1-99中的2 + (200-299)中的2 + (100-199)-300-999)中的2

	//计算2020里面中2的个数(1000-1999) 2000-2020
	countAll = count3 + count3 + (21+3);

	cout << countAll << endl;

	return 0;
}

法二:

#include<iostReam>
using namespace std;
int count=0;
int main(){
	int tmp=0;
	for(int i=1;i<=2020;i++){
		tmp=i;
		while(tmp){
			if(tmp%10 == 2) count++;
			tmp/=10;
		}
	}
	cout<<count;
	return 0;
} 

        答案:624

2021-10-19


【问题描述    B】
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如3/4,5/2,1/8,7/1,都是既约分数。
请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
 

#include<iostream>
using namespace std;

int main() {

	int count = 4039;
	int num = 2;
	for (int i = 2; i <= 2020; i++) {
		for (int j = 2; j <= 2020; j++) {
			num = 2;
			if (i < j) {
				while (num <= i && ((i % num !=0) || (j % num !=0))) {
					num++;
				}
				if (num == (i + 1)) {
					count++;
					//cout << count << endl;
				}
			}
			else if (i > j) {
				while (num <= j && ((i % num != 0) || (j % num != 0))) {
					num++;
				}
				if (num == (j + 1)) {
					count++;
					//cout << count << endl;
				}
			}
			else {
				continue;
			}
		}
	}
	cout << count << endl;
	return 0;
}

        答案:2481215

2021-10-24

【问题描述  C】
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。
1  2  6  7  15..
3  5  8  14 ...
4  9  13 ...
10 12 ...
11 ...
容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include<iostream>
using namespace std;

int main() {
	int num = 1;//从1开始
	int count = 1;
	int x = 0, y = 0;//元素坐标,行为x,列为y
	while (x != 19 || y != 19) {
		if (x == 0 && y == 0) {
			y = count;
			num ++;
			y--;
			x++;
			num++;
			count++;
			continue;
		}
		if (x == 0) {
			y = count;
			num++;
			for (int i = 0; i < count; i++) {
				y--;
				x++;
				num++;
				if (x == 19 && y == 19) {
					break;
				}
			}
			count++;
		}
		else {
			x = count;
			num++;
			for (int i = 0; i < count; i++) {
				x--;
				y++;
				num++;
				if (x == 19 && y == 19) {
					break;
				}
			}
			count++;
		}

	}
	cout << num << endl;
	return 0;
}

        答案:761

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值