diff --git a/primes.h b/primes.h new file mode 100644 index 0000000..ca4060e --- /dev/null +++ b/primes.h @@ -0,0 +1,21 @@ +int is_prime(long num) +{ + int i = 5; + int w = 2; + + if (num == 1) + return 0; + if (num == 2 || num == 3) + return 1; + if (!(num%2) || !(num%3)) + return 0; + + while ((i*i) <= num) { + if (!(num%i)) + return 0; + i += w; + w = 6 - w; + } + + return 1; +} diff --git a/problem-46.c b/problem-46.c new file mode 100644 index 0000000..fdac17e --- /dev/null +++ b/problem-46.c @@ -0,0 +1,45 @@ +#include +#include "primes.h" + +int next_prime(int num) +{ + num++; + while (1) + if (is_prime(num)) { + return num; + } else { + num++; + } +} + +int check(int num) +{ + int i; + int prime = 2; + + while (prime < num) { + for (i=1; i<(num-prime+1); i++) + if (num == prime+2*(i*i)) + return 1; + prime = next_prime(prime); + } + + return 0; +} + + +int main(int argc, char** argv) +{ + int i = 9; /* First odd composite */ + while (1) { + if (!(check(i))) + break; + + do { + i += 2; + } while (is_prime(i)); + } + + printf("The solution is %d\n", i); + return 0; +}