紫薯P52 例题3-5
一、题意
已知 y = x + sum(x的各位数字) (1 <= y <= 100000)
有kase组数据,每组给出一个数字y,要求输出对应的最小x。
二、解析
由于y有大小限制,所以容易得出x最多比y小 5*9=45,因此对于每个y枚举比它小的44个数字即可.
三、代码
#include <iostream>
#include <cmath>
using namespace std;
int kase, n;
int num_sum(int x) {
int res = 0;
while(x) {
res += x % 10;
x /= 10;
}
return res;
}
int solve(int n) {
for(int i = max(0, n - 45); i < n; i ++) {
if(n == i + num_sum(i)) return i;
}
return 0;
}
int main() {
cin >> kase;
while(kase --) {
cin >> n;
cout << solve(n) << endl;
}
}
/*
3
216
121
2005
*/四、归纳
- 数学题不要慌,先仔细思考清楚!
- 看到紫薯给的思路是刷表法,即枚举x从1到100000所有数字,然后维护出能算出y的所有x的最小值。从这里可以学习到,对于有明确一对一的数字关系时,有时可以反过来思考。
果然和紫薯的思考方式永远不一样233

京公网安备 11010502036488号