我给出c语言针对任意阶数的魔方矩阵程序(运行过的,绝对没问题),一般网上只有奇次的,这个可以针对任意数:
#include <stdio.h>
#include <math.h>
#define N 100 /*N可以改变*/
void main()
{
int n,p=1;
void jici(int n);
void sibeishu(int n);
void elseoushu(int n);
printf("***说明(本程序用于输出任意数阶次的魔方矩阵,其行,列,对角线之和的均值相同。)\n");
printf(" ***说明(最右边的,和最下边的用于统计每行,每列的元素之和 。) \n\n");
printf(" 请输入一个要求阶次的魔方矩阵的边长(2~%d): ",N);
while(p)
{
scanf("%d",&n);
if((n>1)&&(n<=N))
p=0;
}
if(fabs((n-1)%2)<1e-006)
jici(n);
else
if(fabs((n%4))<1e-006)
sibeishu(n);
else
elseoushu(n);
}
void jici(int n)
{
int a[N][N]={0};
int i,j,k,sum;
i=0;
j=(n-1)/2;
a[0][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>n-1))
{
i=i+2;j=j-1;
}
else
{
if(i<0) i=n-1;
if(j>n-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}
void sibeishu(int n)
{
int a[N][N]={0};
int k,t,i,j,sum;
k=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a[i][j]=k;
k++;
}
for(i=0,j=0;i<n/2;i++,j++)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
for(i=0,j=n-1;i<n/2;i++,j--)
{
t=a[i][j];
a[i][j]=a[n-1-i][n-1-j];
a[n-1-i][n-1-j]=t;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}
void elseoushu(int n)
{
int a[N][N]={0};
int m,k,i,j,sum,u,t,h;
m=n/2;
i=0;
j=(m-1)/2;
a[0][j]=1;
for(k=2;k<=m*m;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>m-1))
{
i=i+2;j=j-1;
}
else
{
if(i<0) i=m-1;
if(j>m-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=0;
j=(m-1)/2+m;
a[i][j]=m*m*2+1;
for(k=m*m*2+2;k<=m*3*m;k++)
{
i=i-1;
j=j+1;
if((i<0)&&(j>m*2-1))
{
i=i+2;
j=j-1;
}
else
{
if(i<0) i=m-1;
if(j>m*2-1) j=m;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=m;
j=(m-1)/2;
a[i][j]=m*m*3+1;
for(k=m*m*3+2;k<=m*4*m;k++)
{
i=i-1;
j=j+1;
if((i<m)&&(j>m-1))
{
i=i+2;j=j-1;
}
else
{
if(i<m) i=m*2-1;
if(j>m-1) j=0;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
i=m;
j=(m-1)/2+m;
a[i][j]=m*m+1;
for(k=m*m+2;k<=2*m*m;k++)
{
i=i-1;
j=j+1;
if((i<m)&&(j>m-1+m))
{
i=i+2;
j=j-1;
}
else
{
if(i<m) i=m*2-1;
if(j>m*2-1) j=m;
}
if(a[i][j]==0) a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
t=(n+2)/4;u=n/2;
for(j=0;j<t-1;j++)
for(i=0;i<m;i++)
{
h=a[i][j];
a[i][j]=a[i+m][j];
a[i+m][j]=h;
}
for(j=n-t+2;j<n;j++)
for(i=0;i<m;i++)
{
h=a[i][j];
a[i][j]=a[i+m][j];
a[i+m][j]=h;
}
{
h=a[t-1][0];
a[t-1][0]=a[t+u-1][0];
a[t+u-1][0]=h;
}
{
h=a[t-1][t-1];
a[t-1][t-1]=a[t+u-1][t-1];
a[t+u-1][t-1]=h;
}
sum=0;
for(i=0,j=0;i<n;i++,j++)
{
sum=sum+a[i][j];
}
a[n][n]=sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<n;j++)
sum=sum+a[i][j];
a[i][n]=sum;
}
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<n;i++)
sum=sum+a[i][j];
a[n][j]=sum;
}
for(i=0;i<n+1;i++)
{
for(j=0;j<n+1;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}