Advertisement
CloneTrooper1019

UVa 10042 - Smith Numbers

Nov 26th, 2016
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #ifdef _MSC_VER
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #endif
  4.  
  5. #include <iostream>
  6. #include <sstream>
  7. #include <cmath>
  8. #include <vector>
  9.  
  10. using namespace std;
  11.  
  12. const int maxVal = 10e6;
  13. bool sieve[maxVal];
  14.  
  15. int nextInt()
  16. {
  17.     int next;
  18.     scanf("%d", &next);
  19.     return next;
  20. }
  21.  
  22. int sumDigits(int num)
  23. {
  24.     string sNum = to_string(num);
  25.     int sum = 0;
  26.     for (int i = 0; i < sNum.length(); i++)
  27.     {
  28.         string val = sNum.substr(i, 1);
  29.         sum += stoi(val);
  30.     }
  31.     return sum;
  32. }
  33.  
  34. bool isPrime(int n)
  35. {
  36.     return (n < maxVal && !sieve[n]);
  37. }
  38.  
  39. int main()
  40. {
  41.     // Load sieve array.
  42.     sieve[0] = true;
  43.     sieve[1] = true;
  44.  
  45.     for (int i = 2; i*i <= maxVal; i++)
  46.         if (!sieve[i])
  47.             for (int j = i * 2; j < maxVal; j += i)
  48.                 sieve[j] = true;
  49.  
  50.     // Load prime array.
  51.     vector<int> primes;
  52.     primes.reserve(10000);
  53.  
  54.     for (int i = 0; i < maxVal; i++)
  55.     {
  56.         if (!sieve[i])
  57.             primes.push_back(i);
  58.     }
  59.  
  60.     int numCases = nextInt();
  61.  
  62.     for (int t = 0; t < numCases; t++)
  63.     {
  64.         int num = nextInt();
  65.         int nDigitSum = 0;
  66.         int primeSum = -1;
  67.  
  68.         while (nDigitSum != primeSum)
  69.         {
  70.             int nextNum = ++num;
  71.             nDigitSum = sumDigits(num);
  72.             primeSum = 0;
  73.  
  74.             if (!isPrime(nextNum))
  75.             {
  76.                 int i = 0;
  77.  
  78.                 while (i < maxVal && pow(primes[i], 2) <= nextNum)
  79.                 {
  80.                     if (nextNum % primes[i] == 0)
  81.                     {
  82.                         int factorSum = sumDigits(primes[i]);
  83.                         while (nextNum % primes[i] == 0)
  84.                         {
  85.                             nextNum /= primes[i];
  86.                             primeSum += factorSum;
  87.                         }
  88.                     }
  89.  
  90.                     i++;
  91.                 }
  92.  
  93.                 if (num != nextNum && nextNum != 1)
  94.                     primeSum += sumDigits(nextNum);
  95.             }
  96.         }
  97.  
  98.         printf("%d\n", num);
  99.     }
  100.  
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement