平台:
UVa Online Judge
題號:
1583 - Digit Generator
題目連結:
題目說明:
如果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 }
Happy Life Forever