【题解】[蓝桥杯 2019 省 B] 特别数的和

38 阅读1分钟

[蓝桥杯 2019 省 B] 特别数的和

题目描述

小明对数位中含有 22001199 的数字很感兴趣(不包括前导 00),在 114040 中这样的数包括 1122991010323239394040,共 2828 个,他们的和是 574574

请问,在 11nn 中,所有这样的数的和是多少?

输入格式

输入一行包含一个整数 nn

输出格式

输出一行,包含一个整数,表示满足条件的数的和。

输入输出样例 #1

输入 #1

40

输出 #1

574

说明/提示

对于 20%20\% 的评测用例,1n101 \le n \le 10

对于 50%50\% 的评测用例,1n1001 \le n \le 100

对于 80%80\% 的评测用例,1n10001 \le n \le 1000

对于所有评测用例,1n100001 \le n \le 10000

蓝桥杯 2019 省赛 B 组 F 题。

题目分析

目的:统计满足条件的数的和。

阅读可知,需要满足的条件是:数位中含有2,0,1,92,0,1,9的数字。我们可以遍历1n1\sim 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;
}