Digit Generator UVa1583
code1:
1 #include<stdio.h> 2 3 //count the number of the digit. 4 int count_digits(int a) 5 { 6 int count = 0; 7 while(a) 8 { 9 a /= 10; 10 count++; 11 } 12 return count; 13 } 14 15 //the function to be used to judge the digit 16 /* 17 yes : return the generator 18 no : retur 0. 19 */ 20 int judgement(int a) 21 { 22 int i = 0; 23 int count = count_digits(a); 24 for(i = a - count*9; i < a; i++) 25 { 26 int sum = i; 27 int temp = i; 28 while(temp > 0) 29 { 30 sum += temp%10; 31 temp /= 10; 32 } 33 if(sum == a) return i; 34 } 35 return 0; 36 } 37 38 int main() 39 { 40 int T, a; 41 scanf("%d",&T); 42 int i = 0; 43 for(; i < T; i++) 44 { 45 scanf("%d",&a); 46 printf("%d\n",judgement(a)); 47 } 48 return 0; 49 50 }
ps:
- 刚开始写的时候出现了一点问题,出现了死循环,在这种情况下应该冷静地插入多个标记来看是哪里发生了死循环,并且尽快更正。
code2(这个是算法书上面的源码,可以效率比我那个上面的高0.3):
1 #include<stdio.h> 2 #include<string.h> 3 #define maxn 100005 4 5 int ans[maxn]; 6 7 void initial(void) 8 { 9 memset(ans, 0, sizeof(ans)); 10 for(int m = 1; m < maxn; m++) 11 { 12 int x = m, y = m; 13 while (x >0) { y += x % 10; x /= 10;} 14 if(ans[y] == 0 || m < ans[y]) ans[y] = m; 15 } 16 } 17 int main() 18 { 19 int T, n; 20 initial(); 21 scanf("%d", &T); 22 while(T--) 23 { 24 scanf("%d", &n); 25 printf("%d\n", ans[n]); 26 } 27 return 0; 28 29 }
上面的代码是通过提前生成一个由位置数和其生成数一一对应的数组,要求一个数的生成数的时候只需要查表,效率更高。可以在有类似的题目的时候进行参考。
Do not let your ego get in you way!