素数幻方
下面的代码我是照着书本敲的,为什么,它不能输出矩阵的?#include<stdio.h>
#include<math.h>
int number[210][5]; //用来存储可逆素数和其分解
int select[110]; //放那些可以用在第一行和最后一行的素数下标
int array[4][5]; //临时数组 ,用来存储素数下标和对应下标分解后的各位数字
int count; //可逆素数的数目
int selecount; //可放在第一行和最后一行的数目
int larray[2][200]; //用来存放一行的前两位和前三位的数据
int lcount[2]; // 前两位的数目和前三位的数目
int num(int number); //用来检查是否是可逆素数
int ok(int number); //用来判断是否是素数
void process(int i); //用来分解素数
void copy_num(int i); //用来复制分解后的数字
int comp_num(int i); //用来判断一列下来是否符合可逆素数
int find1(int i); // 用来判断列方向是不是可逆素数
int find2();//用来判断对角线是不是可逆素数
int find0(int num);//用来判断是不是符合的素数
void p_array();//用来输出矩阵
FILE *fp;
main()
{
int i,k,flag,cc=0,i1,i4;
if((fp=fopen("data.dat","w+"))==NULL)
{
printf("不能找到\n");
exit(0);
}
printf("它们是满足的数据");
for(i=1001;i<9999;i+=2)
{
k=i/1000;
if(k%2!=0&&k!=5&&num(i))//求出所有可逆素数并将符合第一第四行的素数下标放在select那里
{
number[count][0]=i;
process(count++);
if(number[count-1][2]%2!=0&&
number[count-1][2]%5!=0&&
number[count-1][3]%5!=0&&
number[count-1][3]%2!=0
)
select[selecount++]=count-1;
}
}
larray[0][lcount[0]++]=number[0][0]/100;
larray[0][lcount[1]++]=number[0][0]/10;
for(i1=0;i1<selecount;i1++)//在第一行内穷举
{
array[0][0]=select[i1];//取对应的素数下标
copy_num(0);//分解对应下标的数字且复制在array中
for(array[1][0]=0;array[1][0]<count;array[1][0]++)//穷举第二行
{
copy_num(1);
if(!comp_num(2))
continue;
for(array[2][0]=0;array[2][0]<count;array[2][0]++)
{
copy_num(2);
if(!comp_num(3))
continue;
for(i4=0;i4<selecount;i4++)
{
array[3][0]=select[i4];
copy_num(3);
for(flag=1,i=1;flag&&i<=4;i++)
if(!find1(i)) flag=0;
if(flag&&find2())
{
printf("NO.%d\n",++cc);
fprintf(fp,"NO.%d\n",cc);
p_array();
}
}
}
}
}
fclose(fp);
}
int num(int number)
{
int j;
if(!ok(number)) return 0;
for(j=0;number>0;number/=10)
j=j*10+number%10;
if(!ok(j)) return 0;
return 1;
}
int ok(int number)
{
int i,j;
if(number%2==0) return 0;
j=sqrt((double)number)+1;
for(i=3;i<=j;i+=2)
if(number%i==0) return 0;
return 1;
}
void process(int i)
{
int j,num;
num=number[i][0];
for(j=4;j>=1;j--,num/=10)
number[i][j]=num%10;
}
void copy_num(int i) //复制分解的数字
{
int j;
for(j=1;j<=4;j++)
array[i][j]=array[array[i][0]][j];
}
int comp_num(int n)
{
static int ii;
static int jj;
int i,num,k,*p;
int *pcount;
switch(n)
{
case 2:pcount=&lcount[0];p=ⅈbreak;
case 3:pcount=&lcount[1];p=&jj;break;
}
for(i=1;i<=4;i++)
{
for(num=0,k=0;k<n;k++)
num=num*10+array[k][i];
if(num<=larray[n-2][*p])
for(;*p>=0&&num<larray[n-2][*p];(*p)--);
else
for(;*p<count&&num>larray[n-2][*p];(*p)++);
if(*p<0||*p>=count)
{*p=0;return 0;}
if(num!=larray[n-1][*p])
return 0;
}
return 1;
}
int find1(int i)//检查列方向是否为可逆素数
{
int num,j;
for(num=0,j=0;j<4;j++)
num=num*10+array[j][i];
return find0(num);
}
int find2()//检查对角线方向是否为满足可逆素数
{
int num1,num2,i,j;
for(num1=0,j=0;j<4;j++)
num1=num1*10+array[j][j+1];
for(num2=0,j=0,i=4;j<4;j++,i--)
num2=num2*10+array[j][i];
if(find0(num1)) return find0(num2);
else return 0;
}
int find0(int num)//检查是否为满足可逆素数
{
static int j;
if(num<number[j][0]) for(;j>=0&&num<number[j][0];j--);
else for(;j<count&&num>number[j][0];j++);
if(j<0||j>=count) {j=0;return 0;}
if(num==number[j][0]) return 1;
else return 0;
}
void p_array()
{
int i,j;
for(i=0;i<4;i++)
{
for(j=1;j<=4;j++)
{
printf("%d ",array[i][j]);
fprintf(fp,"%d ",array[i][j]);
}
printf("\n");
fprintf(fp,"\n");
}
}