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;
}