project-euler

https://projecteuler.net/
Log | Files | Refs | README

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 }