1
0
Fork 0

Problem 41; primes edited to use long instead of int, which may break past uses of primes.

This commit is contained in:
Jonathan Chan 2016-12-06 11:25:32 -08:00
parent e8a4a63635
commit 509cb46f37
4 changed files with 53 additions and 16 deletions

BIN
41 Executable file

Binary file not shown.

37
41.c Normal file
View File

@ -0,0 +1,37 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#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;
}
}
}

View File

@ -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;
}

View File

@ -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);