文章标题
2016-07-16 12:14
357 查看
/* * 素数幻方:求四阶的素数幻方。即在一个4*4矩阵中,每一格填入一个数字,使每一行、每一列和两条对角线上的4个数字组成的四位数均为可逆素数 * StoryMonster 2016/7/12 */ #include <iostream> #include <vector> using namespace std; vector<int> fitPrimeSet; int BackOrder(int n) { int result = 0; while(n) { result = result * 10 + n%10; n/=10; } return result; } bool PrimeNumber(int n) { if(n==0||n==1) return false; for(int i=2;i<n/2;i++) if(n%i == 0) return false; return true; } bool DataInVector(int n,int pos) { int kk = 1; for(int j=pos;j<4;j++) kk*=10; for(vector<int>::iterator i = fitPrimeSet.begin();i!=fitPrimeSet.end();i++) { if(n == (*i/kk)*kk) return true; } return false; } int main() { for(int i=1001;i<=9997;i+=2) { if(PrimeNumber(i)&&PrimeNumber(BackOrder(i))) { fitPrimeSet.push_back(i); // cout << i<< " "; } } cout << endl; vector<int>::iterator r1 = fitPrimeSet.begin(); while(r1 != fitPrimeSet.end()) { int aa = *r1/1000; if(aa%2==0 || aa == 5) {r1++;continue;} aa = (*r1%1000)/100; if(aa%2==0 || aa == 5) {r1++;continue;} aa = (*r1%100)/10; if(aa%2==0 || aa == 5) {r1++;continue;} aa = *r1%10; if(aa%2==0 || aa == 5) {r1++;continue;} vector<int>::iterator r2 = fitPrimeSet.begin(); while(r2 != fitPrimeSet.end()) { aa = (*r1/1000)*1000 + (*r2/1000)*100; if(!DataInVector(aa,2)) {r2++;continue;} aa = (*r1%1000/100)*1000 + (*r2%1000/100)*100; if(!DataInVector(aa,2)) {r2++;continue;} aa = (*r1%100/10)*1000 + (*r2%100/10)*100; if(!DataInVector(aa,2)) {r2++;continue;} aa = (*r1%10)*1000 + (*r2%10)*100; if(!DataInVector(aa,2)) {r2++;continue;} vector<int>::iterator r3 = fitPrimeSet.begin(); while(r3 != fitPrimeSet.end()) { aa = (*r1/1000)*1000 + (*r2/1000)*100 +(*r3/1000)*10; if(!DataInVector(aa,3)) {r3++;continue;} aa = (*r1%1000/100)*1000 + (*r2%1000/100)*100 + (*r3%1000/100)*10; if(!DataInVector(aa,3)) {r3++;continue;} aa = (*r1%100/10)*1000 + (*r2%100/10)*100 + (*r3%100/10)*10; if(!DataInVector(aa,3)) {r3++;continue;} aa = (*r1%10)*1000 + (*r2%10)*100 + (*r3%10)*10; if(!DataInVector(aa,3)) {r3++;continue;} vector<int>::iterator r4 = fitPrimeSet.begin(); while(r4 != fitPrimeSet.end()) { aa = *r4/1000; if(aa%2==0 || aa == 5) {r4++;continue;} aa = (*r4%1000)/100; if(aa%2==0 || aa == 5) {r4++;continue;} aa = (*r4%100)/10; if(aa%2==0 || aa == 5) {r4++;continue;} aa = *r4%10; if(aa%2==0 || aa == 5) {r4++;continue;} //cout<<"r1="<<*r1 << " r2="<<*r2<<" r3="<<*r3<<" r4="<<*r4<<endl; int c1 = (*r1/1000)*1000 + (*r2/1000)*100 + (*r3/1000)*10 + *r4/1000; if(!DataInVector(c1,4)) {*r4++;continue;} int c2 = ((*r1%1000)/100)*1000 + ((*r2%1000)/100)*100 + ((*r3%1000)/100)*10 + (*r4%1000)/100; if(!DataInVector(c2,4)) {*r4++;continue;} int c3 = ((*r1%100)/10)*1000 + ((*r2%100)/10)*100 + ((*r3%100)/10)*10 + (*r4%100)/4; if(!DataInVector(c3,4)) {*r4++;continue;} int c4 = (*r1%10)*1000 + (*r2%10)*100 + (*r3%10)*10 + *r4%10; if(!DataInVector(c4,4)) {*r4++;continue;} int D1 = (*r1/1000)*1000 + ((*r2%1000)/100)*100 + ((*r3%100)/10)*10 + *r4%10; if(!DataInVector(D1,4)) {*r4++;continue;} int D2 = (*r1%10)*1000 + ((*r2%100)/10)*100 + (*r3%1000/100)*10 + *r4/1000; if(!DataInVector(D2,4)) {*r4++;continue;} cout<<"可逆素数幻方:"<<endl; cout<<*r1<<endl; cout<<*r2<<endl; cout<<*r3<<endl; cout<<*r4<<endl; r4++; } r3++; } r2++; } r1++; } return 0; }
相关文章推荐
- C#查找素数实现方法
- java使用筛选法求n以内的素数示例(java求素数)
- java求100以内的素数示例分享
- 判断一个数是不是素数的方法
- C++回文数及素数问题计算方法
- c#求范围内素数的示例分享(c#求素数)
- GO语言求100以内的素数
- Java列出2到100之间所有素数的方法
- Python素数检测实例分析
- Python实现高效求解素数代码实例
- 使用Python判断质数(素数)的简单方法讲解
- Python素数检测的方法
- Python实现求最大公约数及判断素数的方法
- Go语言生成素数的方法
- python学习--埃拉托斯特尼筛法求素数
- 使用Python判断质数(素数)的简单方法讲解
- 【python】编程语言入门经典100例--12
- Python-求素数程序
- 【HDU 2136】Largest prime factor 详细图解
- 数论算法初步理解(1)