diff --git a/41 b/41 new file mode 100755 index 0000000..9f45963 Binary files /dev/null and b/41 differ diff --git a/41.c b/41.c new file mode 100644 index 0000000..6e20bb1 --- /dev/null +++ b/41.c @@ -0,0 +1,37 @@ +#include +#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);