先看代码
#include<stdio.h>
int main()
{
//N为奇数判断矩阵是否为幻方
//行、列、对角线相等就是,否则就不是
int arr[20][20] = { 0 };
int i = 0, j = 0;//行 列
int m = 0;//用户输入一个变量,N*N的矩阵
int sum = 0;
int stand = 0;//比较标准
//用户输入的变量
scanf("%d", &m);
getchar();
//把数据存进数组中
for (i = 0; i < m; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
getchar();
}
//判断是否为幻方
i = 0;
//用第一行的和作为判断标准
for (j = 0; j < m; j++)
{
sum = sum + arr[i][j];
}
stand = sum;
sum = 0;//初始化sum
while (i < m-1)//i,j都是数组的下标,-1
{
//算出第二行的和
i++;
for (j = 0; j < m; j++)
{
sum = sum + arr[i][j];
}
if (sum != stand)
{
printf("No\n");
return 0;
}
sum = 0;//初始化sum
}
//判断列
sum = 0;//初始化sum
while (j < m-1)
{
//算出第一行的和
j++;
for (i = 0; i < m; i++)
{
sum = sum + arr[i][j];
}
if (sum != stand)
{
printf("No\n");
return 0;
}
}
//判断对角线左--》右
sum = 0;
for (i = 0, j = 0; i < m; i++)
{
sum = sum + arr[i][j];
j++;
}
if (sum != stand)
{
printf("No\n");
return 0;
}
//右对角线
sum = 0;
for (i = m, j = m; i >= 0; i--)
{
sum = sum + arr[i][j];
j--;
}
if (sum != stand)
{
printf("No\n");
return 0;
}
//到这里还没结束就成功了
printf("Yes");
return 0;
}
在解决本题中遇到的问题
-
输入过程中用getchar()处理换行符
-
容易忽视的sum初始化