程序在下面,就是从in.txt中读取一个奇数数N,然后写出这个数的幻方。(就是行,列,对角线的和都相等的矩形)
把结果写到文件outA032.txt中。
原来程序都是对的,但是把数据类型改为long(题目的需要),就会出错。
红色的部分就是改动的
/******** Merzirac法生成奇阶幻方:
在第一行居中的方格内放1,依次向左上方填入2、3、4....,
如果左上方已有数字,则向下移一格继续填写。
*********/
#include<stdio.h>
int main(void)
{
void huanfang();
huanfang();
return 0;
}
void huanfang()
{
FILE *fp1,*fp; /* x是行坐标,y是列坐标,k是将二维转换为一维的坐标*/
/* a就是存放幻方的一维数组 */
int k,i,N,*a,j,x1,y1,y,x; /* long k,i,N,*a,j,x1,y1,y,x; */
if ((fp=fopen("in.txt","r")) == NULL)
{
printf("no exit!\n");
exit(0);
}
fp1 = fopen("outA032.txt","w");
/*************下面开始构造幻方 ***********/
while (1)
{
fscanf(fp,"%d",&N); /* fscanf(fp,"%ld",&N) */ /* 读in.txt文件中数据 */
if (N == 0) break;
a= (int *)calloc(N*N,sizeof(int)); /* 开辟一维数组来存放数据*/
/* a= (long *)calloc(N*N,sizeof(long)); */
for (i=1; i<N*N; i++)
a[i]=0;
x=0;
y=N/2;
a[N/2]=1; /* 第一行居中放1 */
for (i=2; i<=N*N; i++)
{
x1 = (x-1+N)%N; /* 保证移动后的元素仍然在矩形中 */
y1 = (y+1+N)%N;
k = x1*N+y1; /* 将二维坐标变换为一维 */
if (a[k] != 0)
x = (x+1+N)%N; /* 如果要移动的位置上有值了,则在原来位置向下走一步*/
else
{
x=x1; /* 如果要移动的位置没有被赋值,则移动到新位置*/
y=y1;
}
k = x*N+y; /* 将二维转换为一维 */
a[k]=i; /* 依次将2,3,4,..... 放入位置 */
}
/************下面将构造好的幻方,写入文件中 ************/
fprintf(fp1,"\n\nN=%d",N); /* 在每次幻方的上面输入N的值 */
/* fprintf(fp1,"\n\nN=%ld",N); */
for (i=0; i<N*N; i++) /* 将存放幻方的数组,写入*/
{
if (i%N == 0 ) /* 每N个元素换行一次,保证输出的是方阵 */
fprintf(fp1,"\n\n");
fprintf(fp1,"%-4d",a[i]); /* fprintf(fp1,"%-4ld",a[i]); */
}
fprintf(fp1,"\n");
}
fclose(fp);
fclose(fp1);
return ;
}
换个名字吸引点人.....
[此贴子已经被作者于2007-10-18 15:21:23编辑过]