Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.43 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int isPrime(int number)
  4. {
  5.     if (number % 2 == 0)
  6.         return number == 2;
  7.  
  8.     int d = 3;
  9.  
  10.     while (d * d <= number)
  11.     {
  12.         if (number % d == 0)
  13.             return 0;
  14.         d += 2;
  15.     }
  16.     return 1;
  17. }
  18.  
  19. int digitalRoot(int number)
  20. {
  21.     return 1 + ((number - 1) % 9);
  22. }
  23.  
  24. int solve(int number)
  25. {
  26.     int factor[19] = { 0 };
  27.     int count = 0;
  28.  
  29.     while (number != 1)
  30.     {
  31.         for (int i = 2; i * i <= number; i++)
  32.         {
  33.             if (number % i == 0)
  34.             {
  35.                 factor[count] = i;
  36.                 count++;
  37.                 number /= i;
  38.                 break;
  39.             }
  40.         }
  41.         if (isPrime(number))
  42.         {
  43.             factor[count] = number;
  44.             count++;
  45.             number = 1;
  46.         }
  47.     }
  48.  
  49.     int maxNow = -1, maxNowI, maxNowJ, maxNowK;
  50.  
  51.     while (maxNow != 0)
  52.     {
  53.         maxNow = 0;
  54.         maxNowI = -1;
  55.         maxNowJ = -1;
  56.         maxNowK = -1;
  57.  
  58.         for (int i = 0; i < 19; i++)
  59.         {
  60.             if (factor[i] == 0)
  61.                 continue;
  62.  
  63.             for (int j = i + 1; j < 19; j++)
  64.             {
  65.                 if (factor[j] == 0)
  66.                     continue;
  67.  
  68.                 if (digitalRoot(factor[i] * factor[j]) > digitalRoot(factor[i]) + digitalRoot(factor[j]) &&
  69.                     digitalRoot(factor[i] * factor[j]) - (digitalRoot(factor[i]) + digitalRoot(factor[j])) >= maxNow)
  70.                 {
  71.                     maxNow = digitalRoot(factor[i] * factor[j]) - (digitalRoot(factor[i]) + digitalRoot(factor[j]));
  72.                     maxNowI = i;
  73.                     maxNowJ = j;
  74.                     maxNowK = -1;
  75.                 }
  76.  
  77.                 for (int k = j + 1; k < 19; k++)
  78.                 {
  79.                     if (factor[k] == 0)
  80.                         continue;
  81.                     if (digitalRoot(factor[i] * factor[j] * factor[k]) > digitalRoot(factor[i]) + digitalRoot(factor[j]) + digitalRoot(factor[k]) &&
  82.                         digitalRoot(factor[i] * factor[j] * factor[k]) - (digitalRoot(factor[i]) + digitalRoot(factor[j]) + digitalRoot(factor[k])) > maxNow)
  83.                     {
  84.                         maxNow = digitalRoot(factor[i] * factor[j] * factor[k]) - (digitalRoot(factor[i]) + digitalRoot(factor[j]) + digitalRoot(factor[k]));
  85.                         maxNowI = i;
  86.                         maxNowJ = j;
  87.                         maxNowK = k;
  88.                     }
  89.                 }
  90.             }
  91.         }
  92.  
  93.         if (maxNow != 0)
  94.         {
  95.             if (maxNowK != -1)
  96.             {
  97.                 factor[maxNowI] = factor[maxNowI] * factor[maxNowJ] * factor[maxNowK];
  98.                 factor[maxNowJ] = 0;
  99.                 factor[maxNowK] = 0;
  100.             }
  101.             else
  102.             {
  103.                 factor[maxNowI] = factor[maxNowI] * factor[maxNowJ];
  104.                 factor[maxNowJ] = 0;
  105.             }
  106.         }
  107.     }
  108.  
  109.     int answer = 0;
  110.    
  111.     for (int i = 0; i < 19; i++)
  112.         answer += digitalRoot(factor[i]);
  113.    
  114.     return answer;
  115. }
  116.  
  117.  
  118. int main()
  119. {
  120.     int answer = 0;
  121.    
  122.     for (int number = 2; number < 1000000; number++)
  123.         answer += solve(number);
  124.  
  125.     printf("%d", answer);
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement