Filename: prob51.cc
// Problem 51 // By replacing the 1st digit of *3, it turns out that six of the nine possible values: 13, 23, 43, 53, 73, and 83, are all prime. // // By replacing the 3rd and 4th digits of 56**3 with the same digit, this 5-digit number is the first example having seven primes among the ten generated numbers, yielding the family: 56003, 56113, 56333, 56443, 56663, 56773, and 56993. Consequently 56003, being the first member of this family, is the smallest prime with this property. // // Find the smallest prime which, by replacing part of the number (not necessarily adjacent digits) with the same digit, is part of an eight prime value family. #include <iostream> #include <math.h> #include <sstream> #include <list> #include <algorithm> #include <stdio.h> #define LB 998LL #define UB 10000000000LL using namespace std; static long long toInt(const string &s) { long long retval; istringstream i(s); i >> retval; return retval; } static bool isPrime(const long long n) { if(n == 1) return false; if(n%2 == 0) return false; for(long long i=3; i<=ceil(sqrt(n)); i+=2) { if(n%i == 0) { return false; } } return true; } static string toString(long long n) { stringstream out; out << n; return out.str(); } static list<string> eligibles(long long n) { list<string> response; string num = toString(n); const int length = num.length(); for(int i=0; i<length-1; ++i) { for(int j=0; j<length-1; ++j) { if(num[i] == num[j] && i != j) { for(int k=0; k<length-1; ++k) { if(num[i] == num[k] && num[j] == num[k] && i != k && j!= k) { string pusher(num); pusher[i] = '-'; pusher[j] = '-'; pusher[k] = '-'; response.push_back(pusher); } } } } } response.sort(); response.unique(); return response; } static void printList(const list<string> &v) { for(list<string>::const_iterator i = v.begin(); i!=v.end(); ++i) { printf("%s ", (*i).c_str()); } } static void printList(const list<long long> &v) { for(list<long long>::const_iterator i = v.begin(); i!=v.end(); ++i) { printf("%lld ", *i); } } list<long long> primeFamily(const string &s) { list<long long> pf; const string searchString("-"); for(char c='0'; c<='9'; ++c) { string working_string(s); string replaceString(1, c); // replace the 'a's with the number string::size_type pos = 0; while ( (pos = working_string.find(searchString, pos)) != string::npos ) { working_string.replace( pos, searchString.size(), replaceString ); pos++; } const long long working_num = toInt(working_string); if(isPrime(working_num)) { if(working_string[0] != '0') { pf.push_back(working_num); } } // if we haven't gotten a prime yet, we should quit now if(c >= '2' && pf.size() == 0) { break; } } return pf; } int main() { long long counter = LB; for(long long x=LB+1; x<UB; x+=2) { if(isPrime(x)) { if(x > counter) { printf("%lld\n", x); counter += 100000; } list<string> l = eligibles(x); for(list<string>::const_iterator i = l.begin(); i != l.end(); ++i) { list<long long> pf = primeFamily(*i); if(pf.size() >= 8) { printList(pf); printf("\n"); return 0; } } } } return 1; }
syntax highlighted by Code2HTML, v. 0.9.1
No comments:
Post a Comment