功能:1)输出任意阶数的奇阶幻方;2)检验输入的方阵是否为奇阶幻方
#include <stdio.h>
#include <stdlib.h>
int create(int a[][100],int n);//生成幻方
int input(int a[][100],int *n);//输入方阵
int check(int a[][100],int n);//检验是否为幻方
int main(void)
{
int a[100][100],n = 0,i,j,t;
while (1)
{
// 功能选择
printf("Which function you want to choose, create1, check2, break0?\n");
scanf("%d",&t);
for (i=0; i<100; i++)
{
for (j=0; j<100; j++)
{
a[i][j] = 0;
}
}
// 输入0,退出
if (t == 0)
{
break;
}
// 输入1,生成幻方
else if (t == 1)
{
while (1)
{
printf("Input an odd number n.\n");
scanf("%d",&n);
if (n%2==1 && n>0)
{
break;
}
else
{
printf("n must be an odd number.\n");
continue;
}
}
create(a,n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%-4d",a[i][j]);
}
printf("\n");
}
}
// 输入2,检验输入的是否为幻方
else if (t == 2)
{
input(a,&n);
if (n%2 == 0)
{
printf("Not odd.\n");
continue;
}
if (check(a, n)==1)
{
printf("Success!\n");
}
else
printf("Fail!\n");
}
}
return 0;
}
int create(int a[][100],int n)
{
int x,i,j,t;
x = 1;
i = 0;
j = (n+1)/2-1;
for (t = 0; t < (n*n); t++)
{
// 已有数
if (i>=0 && j<=(n-1) && *(*(a+i)+j)!=0)
{
i += 2;
j--;
*(*(a+i)+j) = x;
}
// 正常填数
if (i>=0 && j<=(n-1) && *(*(a+i)+j)==0)
{
*(*(a+i)+j) = x;
}
// 行超出
if (i<0 && j<=(n-1))
{
i = n-1;
*(*(a+i)+j) = x;
}
// 列超出
if (i>=0 && j>(n-1))
{
j = 0;
*(*(a+i)+j) = x;
}
// 行列同时超出
if (i<0 && j>(n-1))
{
i = 1;
j = n-1;
*(*(a+i)+j) = x;
}
i--;
j++;
x++;
}
return 0;
}
int input(int a[][100], int *n)
{
int N=0, i, j, num=0;//N为行列号,num为位(包括数、符号和小数点)
char s[100], digit[10]={};
printf("Input the Matrix.\n");
// 通过输入第一行(当作字符串)来判断行列数n
getchar();
gets(s);
// 判断每个字符,到回车跳出
for (i=0; s[i] != '\0'; i++)
{
// 如果此字符是数字
if ((s[i]>='0' && s[i]<='9') || s[i]=='-')
{
digit[num] = s[i];
num++;//这个数的位加一
// 防止不运行最后一个数
if (s[i+1] == '\0')
{
s[i+1] = ' ';
s[i+2] = '\0';
}
}
// 空格处算出这个数
else if (s[i] == ' ')
{
a[0][N] = atof(digit);
N++;
// 初始化位数num和digit[]
for (j=0; j<num; j++)
{
digit[j] = '\0';
}
num = 0;
}
}
// 后 n-1 行直接输入
for (i=1; i<N; i++)
{
for (j=0; j<N; j++)
{
scanf("%d",&a[i][j]);
}
}
*n = N;
return 0;
}
int check(int a[][100],int n)
{
int x,y,t,i,j;
// x为每行列以及对角线的和的理想值,y为每行列以及对角线的和的实际值
x = (n*n*n+n)/2;
y = 0;
t = 0;
// 判断每行和是否正确
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
y += *(*(a+i)+j);
}
if (y == x)
{
t++;
}
y = 0;
}
// 判断每列和是否正确
for (j = 0; j < n; j++)
{
for (i = 0; i < n; i++)
{
y += *(*(a+i)+j);
}
if (y == x)
{
t++;
}
y = 0;
}
// 判断主对角线和是否正确
for (i = 0; i <n; i++)
{
y += *(*(a+i)+i);
}
if (y == x)
{
t++;
}
y = 0;
// 判断副对角线是否正确
for (i = 0; i < n; i++)
{
y += *(*(a+i)+(n-i-1));
}
if (y == x)
{
t++;
}
y = 0;
if (t == (2*n+2))
{
t = 1;
}
else
t =0;
return t;
}