Project Euler Problem 32 Pandigital products
Problem 32
We shall say that an n-digit number is pandigital if it makes use of all the digits 1 ton exactly once; for example, the 5-digit number, 15234, is 1 through 5 pandigital.
The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing multiplicand, multiplier, and product is 1 through 9 pandigital.
Find the sum of all products whose multiplicand/multiplier/product identity can be written as a 1 through 9 pandigital.
HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum.
C++:
#include <iostream> #include <algorithm> #include <set> using namespace std; int main() { int digits[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; long left1, left2, mid1_4, mid2_4, right4; set<long> s; for(;;) { left1 = digits[0]; left2 = digits[1] + digits[0] * 10; mid1_4 = digits[1] * 1000 + digits[2] * 100 + digits[3] * 10 + digits[4]; mid2_4 = digits[2] * 100 + digits[3] * 10 + digits[4]; right4 = digits[5] * 1000 + digits[6] * 100 + digits[7] * 10 + digits[8]; if((left1 * mid1_4 == right4) || (left2 * mid2_4 == right4)) s.insert(right4); if(!next_permutation(digits, digits+9)) break; } long total = 0; for(set<long>::iterator iter=s.begin(); iter!=s.end(); iter++) total += *iter; cout << total << endl; return 0; }
C++:
#include <iostream> #include <cstring> #include <set> using namespace std; const long N1 = 100; const long N2 = 2000; bool ispandigital(long a, long b, long product) { int digits[10], d; memset(digits, 0, sizeof(digits)); while(a) { d = a % 10; if(digits[d]) return false; digits[d] = 1; a /= 10; } if(digits[0]) return false; while(b) { d = b % 10; if(digits[d]) return false; digits[d] = 1; b /= 10; } if(digits[0]) return false; while(product) { d = product % 10; if(digits[d]) return false; digits[d] = 1; product /= 10; } if(digits[0]) return false; for(int i=1; i<10; i++) if(digits[i] == 0) return false; return true; } int main() { long long total = 0; long product; set<long> s; for(long i=1; i<=N1; i++) for(long j=i+1; j<=N2; j++) { product = i * j; if(product > 1000 && ispandigital(i, j, product)) s.insert(product); } total = 0; for(set<long>::iterator iter=s.begin(); iter!=s.end(); iter++) total += *iter; cout << total << endl; return 0; }