Euler_32.cpp (1125B)
1 #include <algorithm> 2 #include <numeric> 3 #include <unordered_set> 4 5 #include "Euler.h" 6 7 int getSubInt(unsigned it1, unsigned it2, std::vector<int> &sub_lex) 8 { 9 int integer = 0; 10 11 for (unsigned i = it1; i < it2; ++i) 12 { 13 integer *= 10; 14 integer += sub_lex[i]; 15 } 16 17 return integer; 18 } 19 20 int Euler::PanDigitalProducts() 21 { 22 int lexicon[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 23 std::vector<int> lex(std::begin(lexicon), std::end(lexicon)); 24 25 std::unordered_set<int> products; 26 27 for (int i = 0; i < EulerUtility::factorial(9); ++i) 28 { 29 for (unsigned it1 = 1; it1 < 5; ++ it1) 30 for (unsigned it2 = it1 + 1; it2 < lex.size() - 3; ++it2) 31 { 32 int multiplicand = getSubInt(0, it1, lex); 33 int multiplier = getSubInt(it1, it2, lex); 34 int product = getSubInt(it2, lex.size(), lex); 35 36 if (multiplicand * multiplier == product) 37 products.insert(product); 38 } 39 40 std::next_permutation(lex.begin(), lex.end()); 41 } 42 43 return std::accumulate(products.begin(), products.end(), 0); 44 }