From d78b3827c176ab40cf254512844e46f2cd78b4eb Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Mon, 5 Dec 2016 02:44:09 -0800 Subject: [PATCH] Problem 35; corrected upper bound of prime-counting function in primes.c --- 35 | Bin 0 -> 10040 bytes 35.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ primes.c | 17 ++++++++------- 3 files changed, 73 insertions(+), 7 deletions(-) create mode 100755 35 create mode 100644 35.c diff --git a/35 b/35 new file mode 100755 index 0000000000000000000000000000000000000000..1f28e1cf44102e26494e4a3757e5817d29010ad2 GIT binary patch literal 10040 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 ZK0LDha{Z$DS*rfi;={MzR%oyPe*gsHCdvQ+ literal 0 HcmV?d00001 diff --git a/35.c b/35.c new file mode 100644 index 0000000..4b92268 --- /dev/null +++ b/35.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include "primes.h" + +int main () { + int bound = 1000000; + + int* primes; + bool* primesTable; + int numPrimes = listOfPrimes (bound, &primes, &primesTable); + + bool* circularPrimesTable = calloc (bound + 1, sizeof (bool)); + for (int i = 0; i < numPrimes; i++) { + if (circularPrimesTable[primes[i]] != true) { + int n = primes[i]; + int numOfDigits = floor (log10 (n)) + 1; + int* digits = malloc (sizeof (int) * numOfDigits); + for (int d = 0; d < numOfDigits; d++) { + digits[d] = n % 10; + n /= 10; + } + + int* circles = malloc (sizeof (int) * numOfDigits); + for (int c = 0; c < numOfDigits; c++) { + circles[c] = 0; + for (int d = c; d < c + numOfDigits; d++) { + circles[c] += digits[d % numOfDigits] * (int) pow (10, d - c); + } + } + free (digits); + + bool circular = true; + for (int c = 0; c < numOfDigits; c++) { + if (primesTable[circles[c]] == false) { + circular = false; + break; + } + } + if (circular) { + for (int c = 0; c < numOfDigits; c++) { + circularPrimesTable[circles[c]] = true; + } + } + free (circles); + } + } + + free (primes); + free (primesTable); + + int sum = 0; + for (int i = 0; i <= bound; i++) { + if (circularPrimesTable[i]) { + sum++; + printf ("%d ", i); + } + } + free (circularPrimesTable); + + printf ("\n%d\n", sum); +} diff --git a/primes.c b/primes.c index d2f9f49..b6e517a 100644 --- a/primes.c +++ b/primes.c @@ -52,7 +52,7 @@ bool isPrimeMem (int n, int* primes) { * * N.B. numOfPrimesUpper is an upper-bound of * the prime-counting function, given by - * n/ln(n) * (1 + 3/2 * 1/ln(n)) + * n/ln(n) * 1.25506 * * runs in O(n * sqrt(n)/ln(n)) (not a tight bound) * @@ -66,19 +66,22 @@ int listOfPrimes (int n, int** primes_ptr, bool** primesTable_ptr) { return 0; } - int numOfPrimesUpper = (int) (n/log(n) * - (1 + 3/2 * 1/log(n))); + int numOfPrimesUpper = (int) (n/log(n) * 1.25506); *primes_ptr = malloc (sizeof (int) * numOfPrimesUpper); int numOfPrimes = 0; for (int i = 0; i <= n; i++) { if (isPrimeMem (i, *primes_ptr)) { - (*primes_ptr)[numOfPrimes++] = i; + (*primes_ptr)[numOfPrimes] = i; (*primesTable_ptr)[i] = true; + numOfPrimes++; } } - if (numOfPrimes < numOfPrimesUpper) - *primes_ptr = realloc (*primes_ptr, - sizeof (int) * numOfPrimes); + if (numOfPrimes < numOfPrimesUpper) { + int* tmp = realloc (*primes_ptr, + sizeof (int) * numOfPrimes); + if (tmp != NULL) + *primes_ptr = tmp; + } return numOfPrimes; }