程序在下面,就是从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编辑过]



 
											





 
	    

 
	

 
										
					
	

 uqjHlUoV.rar
uqjHlUoV.rar