题目列表:
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;
}