蓝桥杯专题之作除取余篇

题目列表:

2015年:奖券数目

2019年:数的分解,特别数的和

2020年:门牌制作

2021年:卡片,时间显示

2022年模拟赛:最2数字

2022年第一次模拟赛:特殊年份

2022年第三次模拟赛:n是否严格递增

1.奖券数目

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

答案:52488

代码:

#include<iostream>
using namespace std;
bool check(int x){
	while(x){
		if(x%10 == 4){
			return true;
		}
		x/=10;
	}
	return false;
}
int main(){
	int ans = 0;
	for(int i =10000;i < 100000;i++){
		if(!check(i)){
			ans++;
		}
	}
	cout << ans;
	return 0;
}

2.数的分解

把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?

注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。

答案:40785

代码: 

#include<iostream>
using namespace std;
bool check(int x){ 
	while(x){
		if(x%10 == 2 || x%10 == 4){
			return false;
		}
		x/=10;
	}
	return true;
}
int main(){
	int ans = 0;
	for(int i = 1;i < 673;i++){
		if(!check(i)) continue;
		for(int j = i+1;j < 1346;j++){
			if(!check(j)) continue;
			int k = 2019-i-j;
			if(k > j && check(k)){
				ans++;
			}
		}
	}
	cout << ans;
	return 0;
}

 

3.特别数的和

【问题描述】

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),
在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,
他们的和是 574。 
请问,在 1 到 n 中,所有这样的数的和是多少?
【输入格式】
输入一行包含两个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】

40
【样例输出】

574
【评测用例规模与约定】 
对于 20% 的评测用例,1≤n≤10。 
对于 50% 的评测用例,1≤n≤100。 
对于 80% 的评测用例,1≤n≤1000。 
对于所有评测用例,1≤n≤10000。

代码:

#include<iostream>
using namespace std;
bool check(int x){
	while(x){
		if(x%10 == 2 || x%10 == 0 || x%10 == 1 || x%10 == 9){
			return true;
		}
		x/=10;
	}
	return false;
}
int main(){
	int n;
	cin >> n;
	int ans = 0;
	for(int i = 1;i <= n;i++){
		if(check(i)){
			ans+=i;
		}
	}
	cout << ans;
	return 0;
}

4.门牌制作

小蓝要为一条街的住户制作门牌号。
这条街一共有2020 位住户,门牌号从1 到2020 编号。
小蓝制作门牌的方法是先制作0 到9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017 需要依次粘贴字符1、0、1、7,即需要1 个字符0,2 个字符1,1 个字符7。
请问要制作所有的1 到2020 号门牌,总共需要多少个字符2?

答案:624

代码:

#include<iostream>
using namespace std;
int check(int x){
	int cnt = 0;
	while(x){
		if(x%10 == 2){
			cnt++;
		}
		x/=10;
	}
	return cnt;
}
int main(){
	int ans = 0;
	for(int i = 1;i <= 2020;i++){
		ans+=check(i);
	}
	cout << ans;
	return 0;
}

 

5.卡片

小蓝有很多数字卡片,每张卡片上都是数字 0到 9。 小蓝准备用这些卡片来拼一些数,他想从 1开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30张卡片,其中 0到 9各 3 张,则小蓝可以拼出 1到 10, 但是拼11时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1拼到多少?

答案:3181

代码:

#include<iostream>
using namespace std;
int a[9];
bool check(int x){
	while(x){
		if(a[x%10] > 0){
			a[x%10]--;
		}else{
			return false;
		}
		x/=10;
	}
	return true;
}
int main(){
	for(int i = 0;i <= 9;i++){
		a[i] = 2021;
	}
	for(int i = 1;;i++){
		if(!check(i)){//到i就拼不出了 
			cout << i-1;//能够拼到i-1 
			break;
		}
	}
	return 0;
}

 

6.时间显示

题目描述

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。 现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。 给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
【输入格式】

输入一行包含一个整数,表示时间。

【输出格式】

输出时分秒表示的当前时间,格式形如 HH:MM:SS,其中 HH 表示时,值为 0 到 23,MM 表示分,值为 0 到 59,SS 表示秒,值为 0 到 59。时、分、秒 不足两位时补前导 0。

【样例输入 1】

46800999

【样例输出 1】

13:00:00
【样例输入 2】

1618708103123

【样例输出 2】

01:08:23

【评测用例规模与约定】

对于所有评测用例,给定的时间为不超过 10^18 的正整数。

代码:

#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
	long long n;
	cin >> n;
	n /= 1000;
	int ss = n%60;//单位是秒
	int mm = n/60%60;//单位是分钟
	int hh = n/3600%24;//单位是小时
	printf("%02d:%02d:%02d",hh,mm,ss);
	return 0;
}

7.最2数字

如果一个整数的某个数位包含 2 ,则称这个数为一个“最2数字”。例如:102、2021 都是最2数字。
请问在 1(含) 到 2021(含) 中,有多少个最2数字。

答案:564 

代码:

#include<iostream>
using namespace std;
bool check(int x){
	while(x){
		if(x%10==2){
			return true;
		}
		x/=10;
	}
	return false;
}
int main(){
	int ans = 0;
	for(int i = 1;i <= 2021;i++){
		if(check(i)){ 
			ans++;
		}
	}
	cout << ans;
	return 0;
}

 

8.特殊年份

今年是 2021 年,2021 这个数字非常特殊,它的千位和十位相等,个位比百位大 1,我们称满足这样条件的年份为特殊年份。

输入 5 个年份,请计算这里面有多少个特殊年份。

输入格式
输入 5 行,每行一个 4 位十进制数(数值范围为 1000 至 9999),表示一个年份。

输出格式
输出一个整数,表示输入的 5 个年份中有多少个特殊年份。

输入样例:
2019
2021
1920
2120
9899
输出样例:
2
样例解释
2021 和 9899 是特殊年份,其它不是特殊年份。

代码:

#include<iostream>
using namespace std;
int main(){
	int ans = 0;
	int x;
	for(int i = 0;i < 5;i++){
		cin >> x;
		if(x/10%10 == x/1000 && x%10 == x/100%10+1){ 
			ans++;
		}
	}
	cout << ans;
	return 0;
}

 

9.n是否严格递增

【问题描述】

​ 给定一个正整数 n,请判断 n 的所有数位上的值是否从左到右是严格递增的。

​ 例如:1589 是严格递增的 。

​ 再如:1336 不是严格递增的,中间有相同的 3。

​ 再如:1598 不是严格递增的。

【输入格式】

​ 输入一行包含一个正整数 n。

【输出格式】

​ 如果是严格递增的,输出“YES”(全大写),否则输出“NO”(全大写)。

【样例输入】

1589

【样例输出】

YES

【样例输入】

1336

【样例输出】

NO

【评测用例规模与约定】

​ 对于所有评测用例,1 <= n <= 1000000000。

代码:

#include<iostream>
using namespace std;
bool check(int x){
	int last = 10;
	while(x){
		if(last<=(x%10)){
			return false;
		}
		last = x%10;
		x/=10;
	}
	return true;
}
int main(){
	long long x;
	cin >> x;
	if(check(x)){
		cout << "YES";
	}else{
		cout << "NO";
	}
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值