#include<iostream> #include<set> #include <numeric> #include<time.h> #include<math.h> using namespace std; bool handle(int i, int j, int d) { if( d>9999 ) return false; set<int> si; //乘数 int tmp = i/10; si.insert(tmp); tmp = i - tmp*10; if(0 == tmp || si.count(tmp)) return false; else si.insert(tmp); //被乘数 tmp = j / 100; if(0 == tmp || si.count(tmp)) return false; else si.insert(tmp); j = j - tmp * 100; tmp = j / 10; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); tmp = j - tmp*10; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); //乘积 tmp = d / 1000; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); d = d - tmp * 1000; tmp = d / 100; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); d = d - tmp * 100; tmp = d / 10; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); tmp = d - tmp*10; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); if(9==si.size()) return true; else return false; } bool dhandle(int i, int j, int d) { if( d>9999 ) return false; set<int> si; int tmp = i; si.insert(tmp); tmp = j / 1000; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); j = j - tmp * 1000; tmp = j / 100; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); j = j - tmp * 100; tmp = j / 10; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); tmp = j - tmp*10; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); //乘积 tmp = d / 1000; if(0 == tmp) return false; else si.insert(tmp); d = d - tmp * 1000; tmp = d / 100; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); d = d - tmp * 100; tmp = d / 10; if(0 == tmp || si.count(tmp)) return false; else si.insert(tmp); tmp = d - tmp*10; if(0 == tmp|| si.count(tmp)) return false; else si.insert(tmp); if(9==si.size()) return true; else return false; } int main() { double start = clock(),end(0); set<int> sum; //乘数2位,被乘数3位,积;三者拆成单个字符,放入set容器,无0且size为9时,记录 for(int i=12; i!=98; i++) { for(int j=123; j!=987; j++) { int d = i * j; if(handle(i,j,d)) { cout << i <<" "<<j<<" "<<d <<endl; sum.insert(d); } } } for(int i=1; i!=10; i++) { for(int j=1234; j!=9876; j++) { int d = i * j; if(dhandle(i,j,d)) { cout << i <<" "<<j<<" "<<d <<endl; sum.insert(d); } } } cout<< accumulate( sum.begin(), sum.end(), 0 ); end = clock(); double runtime = (end - start)/1000; cout.setf(ios::fixed); cout << endl << "run time is " << runtime << endl; system("PAUSE"); return 0; } #include<iostream> #include<set> #include<numeric> #include<time.h> #include<math.h> using namespace std; bool handle(int i, int j) { int d = i * j; if( d>9999 ) return false; set<int> si; while(i) { if( i%10==0 )//|| si.count(i%10)) return false; si.insert(i%10); i /= 10; } while(j) { if( j%10==0 )//|| si.count(j%10)) return false; si.insert(j%10); j /= 10; } while(d) { if( d%10==0 )//|| si.count(d%10)) //不寻找重复数节约0.2秒 return false; si.insert(d%10); d /= 10; } if(9 == si.size()) return true; else return false; } int main() { double start = clock(),end(0); set<int> sum; for(int i=12; i!=98; i++) { for(int j=123; j!=987; j++) { if(i%10==0 || j%10==0) continue; if(handle(i,j)) { cout << i <<" "<<j<<" "<<i * j <<endl; sum.insert(i * j); } } } for(int i=1; i!=10; i++) { for(int j=1234; j!=9876; j++) { if(i%10==0 || j%10==0) continue; if(handle(i,j)) { cout << i <<" "<<j<<" "<<i * j<<endl; sum.insert(i * j); } } } cout<< accumulate( sum.begin(), sum.end(), 0 ); end = clock(); double runtime = (end - start)/1000; cout.setf(ios::fixed); cout << endl << "run time is " << runtime << endl; system("PAUSE"); return 0; }