(百例编程)35.素数幻方(可深究)

题目:求四阶的素数幻方。即在一个4X4 的矩阵中,每一个格填 入一个数字,使每一行、每一列和两条对角线上的4 个数字所组成的四位数,均为可逆素数。

#include
#include 
using namespace std;
bool is_keni(int a);//判断可逆素数
bool is_sushu(int b);//判断素数
bool is_shaxuan(int c);//筛选函数
bool chaifen(int i,int j,int m,int n);//拆分函数
bool yanzheng(int t);//验证是不是可逆素数

int a[4][4];//存储题目要求的4*4矩阵
vector su1;//存储千位为1的可逆素数
vector su3;//存储千位为3的可逆素数
vector su7;//存储千位为7的可逆素数
vector su9;//存储千位为9的可逆素数
vector s1;//存放可逆素数
vector s2;//存放筛选后的可逆素数

int main(void)
{
   for (int i=1001;i!=9999;i+=2)
   {
	   if (is_keni(i))
	   {
		   s1.push_back(i);
		   if (is_shaxuan(i))
		   {
			   s2.push_back(i);
		   }
		   /*对可逆素数进行分段存*/
		   if (i>1000&&i<3000)
		   {
			   su1.push_back(i);
		   }
		   else if (i>3000&&i<7000)
		   {
			   su3.push_back(i);
		   }
		   else if (i>7000&&i<9000)
		   {
			   su7.push_back(i);
		   }
		   else
		   {
			   su9.push_back(i);
		   }

	   }	   
   }
for (int i=0;i0;--k,k1*=10)
								  {
									  a[0][k]=s2[i]/k1%10;
								  }
								  for(int k=3,k1=1;s1[m]/k1>0;--k,k1*=10)
								  {
									  a[1][k]=s1[m]/k1%10;
								  }
								  for(int k=3,k1=1;s1[n]/k1>0;--k,k1*=10)
								  {
									  a[2][k]=s1[n]/k1%10;
								  }
								  for(int k=3,k1=1;s2[j]/k1>0;--k,k1*=10)
								  {
									  a[3][k]=s2[j]/k1%10;
								  }
								  for (int q=0;q!=4;++q)
									  for(int q1=0;q1!=4;++q1)
								  {
									  cout<::iterator ite=su1.begin();ite!=su1.end();++ite)
			{
				if ((*ite)==t)
				{
                       return true;
				}
			}
			return false;
			break;
		}

	case 3:
		{
			for (vector::iterator ite=su3.begin();ite!=su3.end();++ite)
			{
				if ((*ite)==t)
				{
					return true;
				}
			}
			return false;
			break;
		}
	case 7:
		{
			for (vector::iterator ite=su7.begin();ite!=su7.end();++ite)
			{
				if ((*ite)==t)
				{
					return true;
				}
			}
			return false;
			break;
		}
	case 9:
		{
			for (vector::iterator ite=su9.begin();ite!=su9.end();++ite)
			{
				if ((*ite)==t)
				{
					return true;
				}
			}
			return false;
			break;
		}
	default:
		{
			return false;
			break;
		}		
	}

}

bool is_sushu(int b)//素数判断
{
	for (int i=2;i<=b/2;++i)
	{
		if (b%i==0)
		{
			return false;
			
		}
		if (i==b/2)
		{
			return true;
		}
	}
}

bool is_keni(int a)//可逆素数判断
{
	int a1[4],s=0;
	if (is_sushu(a))
	    {
             for (int j=0,k=1,t=1000;a/k>0;k*=10,t/=10,++j )//取位操作
                 {
                          a1[j]=a/k%10;
		                   s+=a1[j]*t;
                  }
	             if (is_sushu(s))
	              {
		              return true;
	               }
	          else
	             {
		             return false;
	             }
	   }
	else
	{
           return false;
	}
}

bool is_shaxuan(int c)//筛选函数
{
	int a1[4];
  for (int i=0,k=1;c/k>0;k*=10,++i)
  {
     a1[i]=c/k%10;
	 if (a1[i]%2==0||a1[i]==5)//第一行和最后一行的数不能为偶数和5
	 {
		 return false;
	 }
  }
   return true;
}


你可能感兴趣的:(经典百题)