输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出1~n2的自然数构成的魔方阵。
#include<stdio.h>
int main()
{
int a[16][16],i=0,j=0,k=0,p=0,n=0;
p=1;
while(p==1)
{
printf("enter n(n=1--15):");
scanf("%d",&n);
if ((n>=0) && (n<=15) && (n%2!=0))
p=0;
}
for(i=1;i<=n;i++) //初始化操作
{
for(j=1;j<=n;j++)
a[i][j]=0;
}
j=n/2+1;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1)
i=n;
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;
}
}
printf("各行行的和为:\n");
for (i=1;i<=n;i++)
{
int sum=0;
for (j=1;j<=n;j++)
{
printf("%5d",a[i][j]);
sum+=a[i][j];
}
printf("\t\t%d\n",sum);
}
printf("\n\n");
printf("各列列的和为:\n");
for(i=1;i<=n;i++)
{
int sum=0;
for (j=1;j<=n;j++)
{
sum+=a[j][i];
}
printf("%5d",sum);
}
printf("\n\n");
printf("正对角线之和为:\n");
int sum=0;
for(i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
if(i==j)
sum+=a[i][j];
}
}
printf("%5d",sum);
printf("\n\n");
printf("反对角线为之和:\n");
sum=0;
for(i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
if(i==n-j+1)
sum+=a[i][j];
}
}
printf("%5d",sum);
return 0;
}
在VS2019下,需将源文件的scanf改为scanf_s:
#include<stdio.h>
int main()
{
int a[16][16], i = 0, j = 0, k = 0, p = 0, n = 0;
p = 1;
while (p == 1)
{
printf("enter n(n=1--15):");
scanf_s("%d", &n);
if ((n >= 0) && (n <= 15) && (n % 2 != 0))
p = 0;
}
for (i = 1; i <= n; i++) //初始化操作
{
for (j = 1; j <= n; j++)
a[i][j] = 0;
}
j = n / 2 + 1;
a[1][j] = 1;
for (k = 2; k <= n * n; k++)
{
i = i - 1;
j = j + 1;
if ((i < 1) && (j > n))
{
i = i + 2;
j = j - 1;
}
else
{
if (i < 1)
i = n;
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;
}
}
printf("各行行的和为:\n");
for (i = 1; i <= n; i++)
{
int sum = 0;
for (j = 1; j <= n; j++)
{
printf("%5d", a[i][j]);
sum += a[i][j];
}
printf("\t\t%d\n", sum);
}
printf("\n\n");
printf("各列列的和为:\n");
for (i = 1; i <= n; i++)
{
int sum = 0;
for (j = 1; j <= n; j++)
{
sum += a[j][i];
}
printf("%5d", sum);
}
printf("\n\n");
printf("正对角线之和为:\n");
int sum = 0;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (i == j)
sum += a[i][j];
}
}
printf("%5d", sum);
printf("\n\n");
printf("反对角线为之和:\n");
sum = 0;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (i == n - j + 1)
sum += a[i][j];
}
}
printf("%5d", sum);
return 0;
}