描述
通常的n阶幻方由1,2,3,4,...,n^2填入构成。而素数幻方全是由素数构成的各行、各列与两对角线之和均相等的方阵。
试在一般区间[c,d]找出9个素数,构成一个三阶素数幻方,使得该方阵中3行、3列与两对角线上的3个数之和均相等。最后统计出素数幻方的个数。注意,一个素数幻方转置后仍就是素数幻方,但不再计入总数。
规定:幻方中不存在重复的数字!
例如,c=100,d=400,那么区间[100,400]内的素数幻方共有2个,分别是:
No.1:
137 353 191
281 227 173
263 101 317
No.2:
173 359 257
347 263 179
269 167 353
输入
输入正整数c和d(c<d,且d<=2000)。
输出
输出区间[c,d]内的素数幻方个数。
输入样例 1 点击复制
50,500
输出样例 1
共8个素数幻方
#include<stdio.h>
#include<string.h>
#include<math.h>
int pan[4000]={0};
int su[1000]={0};
int cnt=0;
int main()
{
pan[0]=pan[1]=1;
for (int i=2;i<=4000;i++)
{
if (!pan[i])
{
su[cnt]=i;
cnt++;
}
for (int j=0;i*su[j]<=4000 && j<cnt;j++)
{
pan[i*su[j]]=1;
if (i%su[j]==0)
{
break;
}
}
}
int c=0;
int d=0;
int sum=0;
scanf("%d,%d",&c,&d);
for (int i=c;i<=d;i++)
{
if (pan[i])
{
continue;
}
for (int y=2;y<=i-3;y++)
{
for (int x=y+2;x<=i-3;x++)
{
if (x==2*y)
{
continue;
}
int z=x-y;
int w=x+y;
if (i-w<c || i+w>d)
{
continue;
}
if (pan[i-x] || pan[i+x] || pan[i+z] || pan[i-z] || pan[i+y] || pan[i-y] || pan[i+w] || pan[i-w])
{
continue;
}
else
{
sum++;
}
}
}
}
printf("共%d个素数幻方\n",sum);
}