2021第十二届蓝桥杯国赛B组题解(C/C++)

在这里插入图片描述

  • 题目全收集;
  • 答案目前是群里面过的,有误可以评论区指正下;
  • 大题标记了可能拿分,还不能确定100%对

试题 A: 带宽[5 分]

【问题描述】

小蓝家的网络带宽是 200 Mbps,请问,使用小蓝家的网络理论上每秒钟最多可以从网上下载多少 MB 的内容。

【答案:25】

200M带宽 实际网速每秒25M 带宽 除以 8 等于 每秒网速

试题 B: 纯质数[5 分]

【问题描述】

如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。

前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · · 。

如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2, 3, 5, 7, 23, 37 都是纯质数,而 11, 13, 17, 19, 29, 31 不是纯质数。当然 1, 4, 35也不是纯质数。

请问,在 1 到 20210605 中,有多少个纯质数?

【答案:1903】

思路:暴力模拟

#include<bits/stdc++.h>
#include<iostream>
#define ll long long
using namespace std;
            //  0 1 2 3 4 5 6 7 8 9
int book[11] = {
   0,0,1,1,0,1,0,1,0,0};

int noprime[100000000];

void check(){
   
	int e = 20210605;
	noprime[0] = 1,noprime[1] = 1,noprime[2] = 0;
	for(int i = 2; i <= e; i++){
   
		if(!noprime[i]){
   
			for(int j = i * 2; j <= e; j+=i){
   
				noprime[j] = 1;
			}
		}
	}
}
int check(int i){
   
	if(noprime[i]) return 0;
	while(i){
   
		int n = i % 10;
		if(!book[n]) return 0;
		i /= 10;
	}
	return 1;
}

int main(){
   
	int ans = 0;
	check();
	for(int i = 1; i <=20210605; i++){
   
		ans += check(i);
	}
	cout << ans;
	return 0;
} 

试题 C: 完全日期[10 分]

【问题描述】

如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
例如:2021 年 6 月 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16,而
16 是一个完全平方数,它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。
例如:2021 年 6 月 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,
是一个完全平方数。所以 2021 年 6 月 23 日也是一个完全日期。
请问,从 2001 年 1 月 1 日到 2021 年 12 月 31 日中,一共有多少个完全日期?

【答案:977】

解题思路,,暴力模拟/EXCEl公式拉取
因为忘记excel怎么算日期位和了,感觉手写更快
如果那边会操作一行代码拉一下就出来了

//T3
#include<bits/stdc++.h>
#include<iostream>
#define ll long long
using namespace std;
            //     1  2   3  4  5  6  7  8  9 10
int month[13] = {
   0,31,28,31,30,31,30,31,31,30,31,30,31};
int month1[13] = {
   0,31,29,31,30,31,30,31,31,30,31,30,31};

int run(int y){
   
	if(( y % 4 == 0 && y % 100!=0) || y % 400 == 0){
   
		return 1;
	}
	return 0;
}

int check(int y,int m,int d){
   
	int sum = 0;
	while(y){
   
		sum += (y % 10);
		y /= 10;
	}
	while(m){
   
		sum += (m % 10);
		m /= 10;
	}
	while(d){
   
		sum += (d % 10);
		d /= 10;
	}
	for(int i = 1; i <= 20; i++){
   
		if(i*i == sum){
   
			return 1
  • 24
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

404name

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值