Advertisement
Guest User

Untitled

a guest
Apr 13th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 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. printf("A");
  73. *primesSizePtr *= 2;
  74. int *newArray = realloc( *primes, *primesSizePtr * sizeof(int) );
  75. if (!newArray) {
  76. printf("Insufficient memory");
  77. exit(1);
  78. }
  79. *primes = newArray;
  80. }
  81. }
  82.  
  83. void checkThenAddToCache(int number, int **primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr) {
  84. if (number > *largestCacheIntPtr) {
  85. if (isPrime(number) == 1) {
  86. addToCache(number, primes, primesSizePtr, primesIndexPtr, largestCacheIntPtr);
  87. }
  88. }
  89. }
  90.  
  91. int *getThreePrimeAddends(int number, int **primes, int *primesSizePtr, int *primesIndexPtr, int *largestCacheIntPtr) {
  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