Euler_5.cpp (1225B)
1 #include <algorithm> 2 #include <numeric> 3 4 #include "Euler.h" 5 6 void addNewPrimeFactors(int nextDivisor, std::vector<int> &p_factors, std::vector<int> &primes) 7 { 8 std::vector<int> myPrimeFactors(p_factors.size(), 0); 9 int i = 0; 10 11 while (nextDivisor != 1 && primes[i] <= nextDivisor) 12 { 13 if ((primes[i] != -1) && (nextDivisor % primes[i] == 0)) 14 { 15 nextDivisor /= primes[i]; 16 myPrimeFactors[i] += 1; 17 } 18 else 19 ++i; 20 } 21 22 for (uint64_t j = 0; j < myPrimeFactors.size(); ++j) 23 if (p_factors[j] < myPrimeFactors[j]) 24 p_factors[j] = myPrimeFactors[j]; 25 } 26 27 int Euler::DivisibleBy1To20() 28 { 29 int ceiling = 20; 30 std::vector<int> noOfPrimeFactors(ceiling, 0); 31 std::vector<int> primeFactors; 32 std::vector<int> primes = EulerUtility::getPrimesUnderCeilingIndexed(ceiling); 33 34 for (int i = 2; i <= ceiling; ++i) 35 addNewPrimeFactors(i, noOfPrimeFactors, primes); 36 37 for (uint64_t i = 0; i < noOfPrimeFactors.size(); ++i) 38 for (int j = 0; j < noOfPrimeFactors[i]; ++j) 39 primeFactors.push_back(primes[i]); 40 41 return std::accumulate(primeFactors.begin(), primeFactors.end(), 1, EulerUtility::multiply); 42 }