Euler_51.cpp (1584B)
1 #include <algorithm> 2 #include "Euler.h" 3 4 struct pair 5 { 6 int prime; 7 int digit; 8 }; 9 10 int Euler::PrimeDigitReplacements() 11 { 12 std::vector<int> primes = EulerUtility::getPrimesUnderCeilingIndexed(1000000); 13 std::vector<pair> candidates; 14 15 for (int prime : primes) 16 { 17 if (prime != -1) 18 { 19 std::vector<int> digits = EulerUtility::intToDigits(prime); 20 21 int repeatedDigits[3] = {0, 0, 0}; 22 23 for (uint64_t i = 0; i < digits.size() - 1; ++i) 24 if (digits[i] <= 2) 25 ++repeatedDigits[digits[i]]; 26 27 for (int i = 0; i < 3; ++i) 28 if (repeatedDigits[i] == 3) 29 { 30 pair p; 31 p.prime = prime; 32 p.digit = i; 33 candidates.push_back(p); 34 } 35 } 36 } 37 38 for (pair p : candidates) 39 { 40 std::vector<int> digits = EulerUtility::intToDigits(p.prime); 41 std::vector<int> indices; 42 int sizeOfFamily = 1; 43 44 for (uint64_t i = 0; i < digits.size() - 1; ++i) 45 if (digits[i] == p.digit) 46 indices.push_back(i); 47 48 for (int i = 0; i < 10; ++i) 49 { 50 if ((i != p.digit) && (i != 0 || indices[0] != 0)) 51 { 52 for (int idx : indices) 53 digits[idx] = i; 54 55 if (primes[EulerUtility::digitsToInteger(digits)] > 0) 56 ++sizeOfFamily; 57 } 58 } 59 60 if (sizeOfFamily >= 8) 61 return p.prime; 62 } 63 64 return 0; 65 }