From 509cb46f379917601daefa9970be6225cbd0b599 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Tue, 6 Dec 2016 11:25:32 -0800 Subject: [PATCH] Problem 41; primes edited to use long instead of int, which may break past uses of primes. --- 41 | Bin 0 -> 9624 bytes 41.c | 37 +++++++++++++++++++++++++++++++++++++ primes.c | 26 +++++++++++++------------- primes.h | 6 +++--- 4 files changed, 53 insertions(+), 16 deletions(-) create mode 100755 41 create mode 100644 41.c diff --git a/41 b/41 new file mode 100755 index 0000000000000000000000000000000000000000..9f45963868ead05cd9170e747cf38688149a7649 GIT binary patch literal 9624 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 +#include +#include +#include +#include "primes.h" + +bool isPandigital (int n) { + if (n < 1 || n > 987654321) + return false; + + int digits = floor (log10 (n)) + 1; + bool* seen = calloc (digits, sizeof (bool)); + while (n > 0) { + int digit = n % 10; + if (digit == 0 || seen[digit - 1]) + return false; + seen[digit - 1] = true; + n /= 10; + } + for (int d = 0; d < digits; d++) { + if (!seen[d]) + return false; + } + return true; +} + +int main () { + long* primes; + bool* primesTable; + long numPrimes = listOfPrimes (7654321, &primes, &primesTable); + for (long i = numPrimes; i > 0; i--) { + if (isPandigital (primes[i])) { + printf ("%d\n", primes[i]); + break; + } + } +} diff --git a/primes.c b/primes.c index b6e517a..7ee57b0 100644 --- a/primes.c +++ b/primes.c @@ -8,12 +8,12 @@ * runs in O(sqrt(n)) * */ -bool isPrime (int n) { +bool isPrime (long n) { if (n == 0 || n == 1) return false; - int sqrtn = (int) sqrt (n); - for (int i = 2; i <= sqrtn; i++) { + long sqrtn = (long) sqrt (n); + for (long i = 2; i <= sqrtn; i++) { if (n % i == 0) return false; } @@ -26,14 +26,14 @@ bool isPrime (int n) { * runs in O(sqrt(n)/ln(n)) * */ -bool isPrimeMem (int n, int* primes) { +bool isPrimeMem (long n, long* primes) { if (n == 0 || n == 1) return false; if (n == 2 || n == 3) return true; - int sqrtn = (int) sqrt (n); - int i = 0; + long sqrtn = (long) sqrt (n); + long i = 0; while (primes[i] <= sqrtn) { if (n % primes[i++] == 0) return false; @@ -58,7 +58,7 @@ bool isPrimeMem (int n, int* primes) { * */ -int listOfPrimes (int n, int** primes_ptr, bool** primesTable_ptr) { +long listOfPrimes (long n, long** primes_ptr, bool** primesTable_ptr) { *primesTable_ptr = calloc (n + 1, sizeof (bool)); if (n == 0 || n == 1) { @@ -66,10 +66,10 @@ int listOfPrimes (int n, int** primes_ptr, bool** primesTable_ptr) { return 0; } - int numOfPrimesUpper = (int) (n/log(n) * 1.25506); - *primes_ptr = malloc (sizeof (int) * numOfPrimesUpper); - int numOfPrimes = 0; - for (int i = 0; i <= n; i++) { + long numOfPrimesUpper = (long) (n/log(n) * 1.25506); + *primes_ptr = malloc (sizeof (long) * numOfPrimesUpper); + long numOfPrimes = 0; + for (long i = 0; i <= n; i++) { if (isPrimeMem (i, *primes_ptr)) { (*primes_ptr)[numOfPrimes] = i; (*primesTable_ptr)[i] = true; @@ -77,8 +77,8 @@ int listOfPrimes (int n, int** primes_ptr, bool** primesTable_ptr) { } } if (numOfPrimes < numOfPrimesUpper) { - int* tmp = realloc (*primes_ptr, - sizeof (int) * numOfPrimes); + long* tmp = realloc (*primes_ptr, + sizeof (long) * numOfPrimes); if (tmp != NULL) *primes_ptr = tmp; } diff --git a/primes.h b/primes.h index 40b3aee..dc4695b 100644 --- a/primes.h +++ b/primes.h @@ -1,4 +1,4 @@ -bool isPrime (int n); -bool isPrimeMem (int n, int* primes); -int listOfPrimes (int n, int** primes_ptr, bool** primesTable_ptr); +bool isPrime (long n); +bool isPrimeMem (long n, long* primes); +long listOfPrimes (long n, long** primes_ptr, bool** primesTable_ptr); void sieveOfEratosthenes (int n, bool** primesTable_ptr);