Advertisement
Guest User

Untitled

a guest
Apr 12th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. int isPrime(int number);
  6. int isCachedPrime(int number, int *primes, int primesSize);
  7. void addToCache(int number, int *primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr);
  8. void checkThenAddToCache(int number, int *primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr);
  9. int *getThreePrimeAddends(int number, int *primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr);
  10. void printPrimeAddends(int *addends, int number);
  11.  
  12. int main(void) {
  13.  
  14.     int *primes = malloc( 10 * sizeof(int) );
  15.     int primesSize = 10;
  16.     int *primesSizePtr = &primesSize;
  17.     int primesIndex = 0;
  18.     int *primesIndexPtr = &primesIndex;
  19.     int largestCacheInt = 0;
  20.     int *largestCacheIntPtr = &largestCacheInt;
  21.  
  22.     int *addendsFor111 = getThreePrimeAddends(111, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  23.     printPrimeAddends(addendsFor111, 111);
  24.     free(addendsFor111);
  25.  
  26.     int *addendsFor17 = getThreePrimeAddends(17, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  27.     printPrimeAddends(addendsFor17, 17);
  28.     free(addendsFor17);
  29.  
  30.     int *addendsFor199 = getThreePrimeAddends(199, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  31.     printPrimeAddends(addendsFor199, 199);
  32.     free(addendsFor199);
  33.  
  34.     int *addendsFor287 = getThreePrimeAddends(287, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  35.     printPrimeAddends(addendsFor287, 287);
  36.     free(addendsFor287);
  37.  
  38.     int *addendsFor53 = getThreePrimeAddends(53, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  39.     printPrimeAddends(addendsFor53, 53);
  40.     free(addendsFor53);
  41.  
  42.     free(primes);
  43.  
  44.     return 0;
  45. }
  46.  
  47. int isPrime(int number) {
  48.     int i;
  49.     for (i = 2; i <= sqrt(number); i++) {
  50.         if (number % i == 0) {
  51.             return 0;
  52.         }
  53.     }
  54.     return 1;
  55. }
  56.  
  57. int isCachedPrime(int number, int *primes, int primesSize) {
  58.     int i;
  59.     for (i = 0; i < primesSize; i++) {
  60.         if (primes[i] == number) {
  61.             return 1;
  62.         }
  63.     }
  64.     return 0;
  65. }
  66.  
  67. void addToCache(int number, int *primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr) {
  68.     primes[*primesIndexPtr] = number;
  69.     *primesIndexPtr += 1;
  70.     *largestCacheIntPtr = number;
  71.     if (*primesIndexPtr == *primesSizePtr) {
  72.         *primesSizePtr *= 2;
  73.         int *newArray = realloc( primes, *primesSizePtr * sizeof(int) );
  74.         if (!newArray) {
  75.             printf("Insufficient memory");
  76.             exit(1);
  77.         }
  78.         primes = newArray;
  79.     }
  80. }
  81.  
  82. void checkThenAddToCache(int number, int *primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr) {
  83.     if (number > *largestCacheIntPtr) {
  84.         if (isPrime(number) == 1) {
  85.             addToCache(number, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  86.         }
  87.     }
  88. }
  89.  
  90. int *getThreePrimeAddends(int number, int *primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr) {
  91.  
  92.     int *addends = malloc( 3 * sizeof(int) );
  93.  
  94.     if (!addends) {
  95.         printf("Insufficient memory");
  96.         exit(1);
  97.     }
  98.  
  99.     int x, y, z;
  100.  
  101.     for (x = 2; x < number; x++) {
  102.         if (isCachedPrime(x, primes, *primesSizePtr) == 0) {
  103.             checkThenAddToCache(x, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  104.         }
  105.         if (isCachedPrime(x, primes, *primesSizePtr) == 1) {
  106.             for (y = 2; y < number; y++) {
  107.                 if (isCachedPrime(y, primes, *primesSizePtr) == 0) {
  108.                     checkThenAddToCache(y, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  109.                 }
  110.                 if (isCachedPrime(y, primes, *primesSizePtr) == 1) {
  111.                     for (z = 2; z < number; z++) {
  112.                         if (isCachedPrime(z, primes, *primesSizePtr) == 0) {
  113.                             checkThenAddToCache(z, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  114.                         }
  115.                         if (isCachedPrime(z, primes, *primesSizePtr) == 1) {
  116.                             if (x + y + z == number) {
  117.                                 addends[0] = x;
  118.                                 addends[1] = y;
  119.                                 addends[2] = z;
  120.                                 return addends;
  121.                             }
  122.                         }
  123.                     }
  124.                 }
  125.             }
  126.         }
  127.     }
  128.  
  129.     printf("addends not found for %d\n", number);
  130.     free(addends);
  131.     exit(1);
  132. }
  133.  
  134. void printPrimeAddends(int *addends, int number) {
  135.     printf("%d's prime addends: %d, %d, %d\n", number, addends[0], addends[1], addends[2]);
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement