UVa Problem Solution: 10042 - Smith Numbers

来源:互联网 发布:家庭网络组网方案 编辑:程序博客网 时间:2024/06/03 02:43

Follow the problem's statements and you'll get it.

Code:
  1. /***************************************************************************
  2.  *   Copyright (C) 2008 by Liu Kaipeng                                     *
  3.  *   LiuKaipeng at gmail dot com                                           *
  4.  ***************************************************************************/
  5. /* @JUDGE_ID 00000 10042 C++ "Smith Numbers" */
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <cstdio>
  9. #include <cstring>
  10. #include <deque>
  11. #include <fstream>
  12. #include <iostream>
  13. #include <list>
  14. #include <map>
  15. #include <queue>
  16. #include <set>
  17. #include <stack>
  18. #include <string>
  19. #include <vector>
  20. using namespace std;
  21.      
  22. int const max_primes = 31623;     
  23. bool primes[max_primes];
  24. void gen_primes()
  25. {
  26.   primes[0] = primes[1] = false;
  27.   for (int i = 2; i < max_primes; ++i)
  28.     primes[i] = true;
  29.   for (int i = 2; i < max_primes; ++i) {
  30.     for (; i < max_primes && !primes[i]; ++i) {}
  31.     for (int j = 2; i*j < max_primes; ++j)
  32.       primes[i*j] = false;
  33.   } 
  34. }
  35. bool is_smith(int n)
  36. {
  37.   int s1 = 0;
  38.   for (int m = n; m != 0; m /= 10) s1 += m % 10;
  39.   int s2 = 0;
  40.   int f = 2, mf = sqrt(n) + 1;
  41.   for (; n >= f && f < mf && s2 <= s1; ++f) {
  42.     if (!primes[f]) continue;
  43.     if (n % f == 0) {
  44.       int s = 0;
  45.       for (int m = f; m != 0; m /= 10) s += m % 10;
  46.       for (; n % f == 0; n /= f) s2 += s;
  47.     }
  48.   }
  49.   if (s2 != 0 && n != 1) 
  50.     for (int m = n; m != 0; m /= 10) s2 += m % 10;
  51.   return s1 == s2;
  52. }
  53.           
  54. int main(int argc, char *argv[])
  55. {
  56. #ifndef ONLINE_JUDGE
  57.   freopen((string(argv[0]) + ".in").c_str(), "r", stdin);
  58.   freopen((string(argv[0]) + ".out").c_str(), "w", stdout);
  59. #endif
  60.   gen_primes();
  61.   int ncases;
  62.   cin >> ncases;
  63.   for (int n; ncases > 0 && cin >> n; --ncases) {
  64.     int m = n + 1;
  65.     for (; !is_smith(m); ++m) {}
  66.     cout << m << '/n';
  67.   }
  68.   return 0;
  69. }

原创粉丝点击