diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2010-03-21 19:44:09 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2014-08-31 20:32:33 +0200 |
| commit | ed91963d9bb5046ca452e73c6c8a9e60e6d67c08 (patch) | |
| tree | f55bb732eb43a3fee557c8329f984db4e1baad63 /src | |
| parent | 9f9bd65f68bed6bf5a3623f90760be0d46bca91c (diff) | |
project euler solution #32, in C and python
Diffstat (limited to 'src')
| -rw-r--r-- | src/projecteuler/032.c | 64 | ||||
| -rw-r--r-- | src/projecteuler/032.py | 77 |
2 files changed, 141 insertions, 0 deletions
diff --git a/src/projecteuler/032.c b/src/projecteuler/032.c new file mode 100644 index 0000000..13c40b5 --- /dev/null +++ b/src/projecteuler/032.c @@ -0,0 +1,64 @@ + +#include <stdio.h> + +/* + * much faster than python version, though less optimized... + * + * to filter out duplicates and add numbers: + * $ ./032 | sort -u | tr "\n" "+" | sed 's/+$/\n/' | bc + * + */ + +int is_pandigital(long int a, long int b, long int c) +{ + char digits[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + char digit; + int i; + + while(a > 0) + { + digit = a % 10; + if(digit == 0 || digits[digit]++) + return 0; + a /= 10; + } + while(b > 0) + { + digit = b % 10; + if(digit == 0 || digits[digit]++) + return 0; + b /= 10; + } + while(c > 0) + { + digit = c % 10; + if(digit == 0 || digits[digit]++) + return 0; + c /= 10; + } + + for(i=1; i<10; i++) + if(digits[i] != 1) + return 0; + return 1; +} + +int main(void) +{ + long int limit = 10000; + long int a, b, c; + for(a=2; a<limit; a++) + { + for(b=2; b<limit; b++) + { + c = a * b; + if(c > limit) + break; + if(is_pandigital(a, b, c)) + printf("%ld\n", c); + } + } + + return 0; +} + diff --git a/src/projecteuler/032.py b/src/projecteuler/032.py new file mode 100644 index 0000000..86b0956 --- /dev/null +++ b/src/projecteuler/032.py @@ -0,0 +1,77 @@ + +digits = set() +digits.add(1) +digits.add(2) +digits.add(3) +digits.add(4) +digits.add(5) +digits.add(6) +digits.add(7) +digits.add(8) +digits.add(9) + +pandigital = set() +pandigital.add(1) +pandigital.add(2) +pandigital.add(3) +pandigital.add(4) +pandigital.add(5) +pandigital.add(6) +pandigital.add(7) +pandigital.add(8) +pandigital.add(9) + +# return digits that are not in x +def missing(x): + d = set() + while x > 0: + d.add(x % 10) + x /= 10 + return digits - d + +for i in range(2, 5): + new = set() + for x in pandigital: + for y in missing(x): + new.add(x*10 + y) + pandigital |= new +pandigital.remove(1) + + +def is_pandigital(a, b, c): + d = [0]*10 + while a > 0: + digit = a % 10 + if d[digit] > 0: + return False + d[digit] += 1 + a /= 10 + while b > 0: + digit = b % 10 + if d[digit] > 0: + return False + d[digit] += 1 + b /= 10 + while c > 0: + digit = c % 10 + if d[digit] > 0: + return False + d[digit] += 1 + c /= 10 + return d[1:] == [1]*9 + +products = set() + +for a in pandigital: + for b in pandigital: + c = a * b + if c in pandigital and is_pandigital(a, b, c): + #print str(a), "*", str(b), "=", str(c) + products.add(c) + +sum = 0 +for p in products: + sum += p + +print sum + |
