您的位置:首页 > 其它

文章标题

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  素数 可逆素数