文章标题

/*
 * 素数幻方:求四阶的素数幻方。即在一个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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值