【洛谷 P8680】[蓝桥杯 2019 省 B] 特别数的和 题解(暴力枚举+数学)

107 阅读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 题。


思路

首先从输入中读取整数nn

定义一个长整型变量ansans来存储所有满足条件的数的和,初始值为0。

接着,通过一个从1到nn的循环,对每一个整数ii进行处理。在处理每一个整数ii时,复制ii的值给jj,然后通过一个do-while循环,检查jj的每一位是否为2、0、1或9。这个检查是通过取jj除以10的余数(也就是jj的个位数)实现的。如果jj的个位数是2、0、1或9,那么将ii加到ansans上,并结束这个do-while循环。否则,将jj除以10,去掉jj的个位数,然后继续检查下一位。这个do-while循环会一直进行,直到jj变为0,即检查完ii的所有位。

最后,输出ansans,也就是所有满足条件的数的和。


AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

int n;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	ll ans = 0;
	for (int i = 1; i <= n; i++) {
		int j = i;
		do {
			int t = j % 10;
			if (t == 2 || t == 0 || t == 1 || t == 9) {
				// cout << i << "\n";
				ans += i;
				break;
			}
			// cout << j % 10 << " ";
			j /= 10;
		} while (j > 0);
		// cout << "\n";
	}
	cout << ans << "\n";
	return 0;
}