summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/projecteuler/032.c64
-rw-r--r--src/projecteuler/032.py77
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
+