C3L-UVa1583-Digit Generator

Posted on 2020-06-27 22:28  lemonforce  阅读(130)  评论(0编辑  收藏  举报

平台:

UVa Online Judge

題號:

1583 - Digit Generator

題目連結:

https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=448&page=show_problem&problem=4458

題目說明:

如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小生成元。无解输出0。例如,n=216,121,2005时的解分别为198,0,1979。

Each test case takes one line containing an integer N, 1 ≤ N ≤ 100000.

範例輸入:

3
216
121
2005

範例輸出:

198
0
1979

解題方法:

只需算1次,把1到10^6的生成元都算出来,之后调用数组就行。

用生成元求数字,比从数字算生成元要方便快很多。

程式碼:

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int MAXN = 1E5 + 5;
 5 
 6 int num[MAXN] = { 0 };
 7 
 8 int getDigitSum(int a) {
 9     int sum = 0;
10     while (a) {
11         sum += a % 10;
12         a /= 10;
13     }
14     return sum;
15 }
16 
17 void findAll() {
18     for (int i = 0; i < MAXN; i++) {
19         int x = i, y = i;
20         while (x) {
21             y += x % 10;
22             x /= 10;
23         }
24         //这个方法,省去了生成元+各位上的数=原来数的步骤
25         //比直接用循环从1开始凑生成元快得多得多
26         //i是y的生成元
27         if (num[y] == 0 || num[y] > i) {
28             num[y] = i;
29         }
30     }
31 }
32 
33 int main() {
34     memset(num, 0, sizeof(num));
35     findAll();
36     int T = 0;
37     scanf("%d", &T);
38     while (T--) {
39         int a = 0;
40         scanf("%d", &a);
41         printf("%d\n", num[a]);
42     }
43     return 0;
44 }