diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2010-09-24 20:57:47 +0200 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2014-08-31 20:32:41 +0200 |
| commit | 536d4a6fe2b66f95fc97b8019745b40ac5441b4c (patch) | |
| tree | 80cfaaf37a36f22393f80a51ffeff5af7c05fd3a | |
| parent | a85ae27bbe32e8d74c49517b0f9d5713c07cdc6f (diff) | |
projecteuler solution 051
| -rw-r--r-- | src/projecteuler/051.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/projecteuler/051.c b/src/projecteuler/051.c new file mode 100644 index 0000000..ee79ece --- /dev/null +++ b/src/projecteuler/051.c @@ -0,0 +1,121 @@ +#include "common.h" +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +unsigned long* p; + +const int pattern_size = 1024; +unsigned long* patterns; + +void init_patterns() +{ + int i, cur; + unsigned long n, pos; + + patterns = (unsigned long*) malloc(pattern_size*sizeof(unsigned long)); + + for(i=0; i<pattern_size; i++) + { + pos = 1; + cur = i; + n = 0; + while(cur > 0) + { + n += (cur&1)*pos; + pos *= 10; + cur >>= 1; + } + patterns[i] = n; + } +} + +int valid_replacement(unsigned long prime, unsigned long number, unsigned long pattern) +{ + int digit = -1; // replaced digit in prime + + while(pattern > 0) + { + char d1 = pattern % 10; + char d2 = prime % 10; + char d3 = number % 10; + + if(d1 == 1) + { + if(digit < 0) + digit = d2; + else if(digit != d2) // not same digits replaced + return 0; + } + + if(d1 == 0 && d2 != d3) + return 0; + else if(prime == 0 && number != 0) + return 0; + + pattern /= 10; + prime /= 10; + number /= 10; + } + + if(pattern == 0 && prime != number) + return 0; + + return 1; +} + +int check_prime(unsigned long prime) +{ + int i, j; + + for(i=2; i<pattern_size; i++) + { + unsigned long pat = patterns[i]; + unsigned long tmp = prime; + int count = 1; + + if(pat >= 10*tmp) + break; + + for(j=0; j<10; j++) + { + tmp += pat; + + if(isprime(tmp, p) && valid_replacement(prime, tmp, pat)) + count++; + } + + if(count>=8) + { + printf("Pattern: %ld\n", pat); + return 1; + } + } + + return 0; +} + +int main(void) +{ + unsigned long pcount; + unsigned long pos; + + p = primes(1000000); + pcount = p[0]; + + init_patterns(); + + for(pos=1; pos<=pcount; pos++) + { + if(check_prime(p[pos])) + { + printf("Prime: %li\n", p[pos]); + break; + } + } + + free(p); + free(patterns); + return 0; +} + |
