紫薯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