1
0
Fork 0

problem 10 done, and problem 7 rewritten (new is_prime algorithm)

This commit is contained in:
Henrik Hautakoski 2010-04-09 16:20:42 +02:00
parent 8498165fef
commit 2ba8a8aaeb
4 changed files with 64 additions and 36 deletions

18
lib/prime.c Normal file
View file

@ -0,0 +1,18 @@
#include "prime.h"
#include <math.h>
int is_prime(uint32_t p) {
uint32_t i, l;
if (p < 2 || (p & 1) == 0)
return 0;
l = ((uint32_t)sqrt(p)) + 1;
for(i=3; i < l; i+=2)
if (p % i == 0) return 0;
return 1;
}

10
lib/prime.h Normal file
View file

@ -0,0 +1,10 @@
#ifndef __PRIME_H
#define __PRIME_H
#include <stdint.h>
int is_prime(uint32_t p);
#endif /* __PRIME_H */

25
p10.c Normal file
View file

@ -0,0 +1,25 @@
/*
* http://projecteuler.net
*
* Projecteuler - Problem 10
* ------------------------
* 2010-04-06 Henrik Hautakoski
*/
#include <stdio.h>
#include "lib/prime.h"
int main() {
uint32_t i;
uint64_t s = 2;
for(i=3; i < 2e6; i+=2) {
if (is_prime(i))
s += i;
}
printf("%lli\n", s); /* this format throws som warnings but works so whatever */
return 0;
}

47
p7.c
View file

@ -5,50 +5,25 @@
* Projecteuler - Problem 7 * Projecteuler - Problem 7
* ------------------------ * ------------------------
* 2009-12-28 Henrik Hautakoski * 2009-12-28 Henrik Hautakoski
*
* fast and elegant solution using The fundamental theorem of arithmetic wich state:
* any natural number greater than 1 can be prime factorized in only one unique way
* unless it is prime itself.
*/ */
#include <stdio.h> #include <stdio.h>
#include <malloc.h> #include "lib/prime.h"
int isprime(int *pl, int l, int p) {
int i;
for(i=0; i < l; i++) {
if((p % pl[i]) == 0)
return 0;
}
return 1;
}
int main() { int main() {
int i, len = 3, *prime = malloc(sizeof(int)*10001); uint32_t i, p, n = 1;
if (prime == NULL) for(i=3; n < 10001; i+=2) {
return 1;
prime[0] = 2;
prime[1] = 3;
prime[2] = 5;
for(i=6; len < 10001; i++) {
if(!isprime(prime, len, i))
continue;
prime[len++] = i;
}
printf("%i\n", prime[len-1]); if (!is_prime(i))
continue;
free(prime);
p = i;
n++;
}
printf("%i\n", p);
return 0; return 0;
} }