C语言实现输出“魔方阵”。所谓魔方阵是指它的每一行,每一列和对角线之和均相等。
#include
int main()
{
int a[10][10] = {0};
int i,j,n,k;
scanf("%d",&n);
i = 0;
j = n/2;
a[i][j] = 1;
for(k = 2;k<=n*n;k++)
{
i--;
j++;
if(i<0&&j<=n)
i=n;
if(i<0&&j>n)
{
i = i+2;
j = i-1;
}
if(j>n)
{
j = 1;
}
if(a[i][j]==0)
{
a[i][j] = k;
}
else
{
i = i+2;
j = j-1;
a[i][j] = k;
}
}
for(i = 0;ij = 0;j"%5d",a[i][j]);
}
printf("\n");
}
return 0;
}
在你给出的代码中,没有明显的语法错误。但是,可能存在一些逻辑错误,导致无法得到正确的魔方阵输出。
其中一个潜在的问题是:当 n 为偶数时,会出现 a[0][n/2] 和 a[n-1][n/2] 都被赋值为 1 的情况,这样魔方阵的第一列和最后一列的和都是相等的,但这两列的和不应该相等。因此,在处理 i 和 j 的边界时,需要对这种情况进行特殊处理。
另一个问题是,当 k 大于 n*n 时,程序会继续运行,但会输出一些无意义的数字,因此在输出魔方阵时应该只输出前 n 行。
下面是修改后的代码,你可以试着运行一下看看是否正确输出了魔方阵:
#include <stdio.h>
int main()
{
int a[10][10] = {0};
int i,j,n,k;
scanf("%d",&n);
i = 0;
j = n/2;
a[i][j] = 1;
for(k = 2; k <= n*n; k++)
{
i--;
j++;
if (i < 0 && j <= n)
i = n-1;
if (i < 0 && j > n)
{
i = i + 2;
j = j - 1;
}
if (j > n)
j = 1;
if (a[i][j] == 0)
a[i][j] = k;
else
{
i = i + 2;
j = j - 1;
a[i][j] = k;
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: