【题解】 [蓝桥杯 2019 省 B] 特别数的和
题目描述
小明对数位中含有 222、000、111、999 的数字很感兴趣(不包括前导 000),在 111 到 404040 中这样的数包括 111、222、999、101010 至 323232、393939 和 404040,共 282828 个,他们的和是 574574574。
请问,在 111 到 nnn 中,所有这样的数的和是多少?
输入格式
输入一行包含一个整数 nnn。
输出格式
输出一行,包含一个整数,表示满足条件的数的和。
输入输出样例 #1
输入 #1
40
输出 #1
574
说明/提示
对于 20%20\%20% 的评测用例,1≤n≤101 \le n \le 101≤n≤10。
对于 50%50\%50% 的评测用例,1≤n≤1001 \le n \le 1001≤n≤100。
对于 80%80\%80% 的评测用例,1≤n≤10001 \le n \le 10001≤n≤1000。
对于所有评测用例,1≤n≤100001 \le n \le 100001≤n≤10000。
蓝桥杯 2019 省赛 B 组 F 题。
题目分析
目的:统计满足条件的数的和。
阅读可知,需要满足的条件是:数位中含有2,0,1,92,0,1,92,0,1,9的数字。我们可以遍历1∼n1\sim n1∼n中的每个数字,逐个判断是否满足条件,将满足的条件的数字进行累加。对于条件的判断,我们可以将数字进行拆位,将拆出的每一位数字进行比较。
//拆位
while(x){int u=x%10;//数位值x/=10;
}
代码实现
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1e5 + 5;
bool chk(int x){//拆位while(x){int u=x%10;//判断是否是2,0,1,9中的一位if(u==2||u==0||u==1||u==9)return 1;x/=10;}//不符合条件return 0;
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int n,sum=0;cin>>n;//遍历所有数字for(int i=1;i<=n;i++){//满足条件的数字进行累加if(chk(i)) sum+=i;}cout<<sum;return 0;
}