c++语言实现
(1)求奇数幻方
#include"stdio.h"
#include"math.h"
int a[256][256];
int sum;
int check();
void ins(int n);
void main(){
int i,j,n,k,t,p,x;
scanf("%d",&n);
sum=(n*n+1)*n/2;
if(n%2==1) //奇数幻方
ins(n);
if(n%4==2) { //单偶数幻方
k=n/2;
ins(k);
for(i=0; i<k; i++)
for(j=0; j<k; j++){
a[j+k]=a[j]+2*k*k;
a[i+k][j]=a[j]+3*k*k;
a[i+k][j+k]=a[j]+k*k;
}
t=(n-2)/4;
for(i=0; i<k; i++)
for(j=0; j<k; j++){
if((j<t)&&(i<t)){
p=a[j];
a[j]=a[i+k][j];
a[i+k][j]=p;
}
if((j<t)&&(i>k-t-1)){
p=a[j];
a[j]=a[i+k][j];
a[i+k][j]=p;
}
if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){
p=a[j];
a[j]=a[i+k][j];
a[i+k][j]=p;
}
if(j>1&&j<=t){
p=a[j+k];
a[j+k]=a[i+k][j+k];
a[i+k][j+k]=p;
}
}
}
if(n%4==0) { //双偶数幻方
x=1;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
a[j]=x++;
for(i=0; i<n; i++)
for(j=0; j<n; j++){
if(i%4==0&&abs(i-j)%4==0)
for(k=0; k<4; k++)
a[i+k][j+k]=n*n-a[i+k][j+k]+1;
else if(i%4==3&&(i+j)%4==3)
for(k=0; k<4; k++)
a[i-k][j+k]=n*n-a[i-k][j+k]+1;
}
}
if(check(n)==1){
for(i=0; i<n; i++){
for(j=0; j<n; j++)
printf("%5d",a[j]);
printf("\n");
}
}
}
int check(int n) { //检验是否是幻方
int i,j,sum1=0,sum2;
for(i=0; i<n; i++){
for(j=0; j<n; j++)
sum1+=a[j];
if(sum1!=sum)
return 0;
sum1=0;
}
for(i=0; i<n; i++){
for(j=0; j<n; j++)
sum1+=a[j];
if(sum1!=sum)
return 0;
sum1=0;
}
for(sum1=0,sum2=0,i=0,j=0; i<n; i++,j++){
sum1+=a[j];
sum2+=a[n-j-1];
}
if(sum1!=sum)
return 0;
if(sum2!=sum)
return 0;
else
return 1;
}
void ins(int n) { //单偶数幻方的输入
int x,y,m;
x=0;
y=n/2;
for(m=1; m<=n*n; m++){
a[x][y]=m;
if(m%n!=0){
x--;
y++;
if(x<0)
x=x+n;
if(y==n)
y=n-y;
}
else{
x++;
if(x==n)
x=x-n;
}
}
}
(2)求单偶幻方
#include<iostream.h>
#include<iomanip.h>
int main(){
int n,i=0,j=0,a[100][100],tot=0;
cout<<"请输入4的倍数"<<endl;
cin>>n;
for(i=0;i<n;i++)
for(j=0; j<n; j++){
a[j]=++tot;
}
for(i=0; i<n; i++){
for(j=0; j<n; j++){
if(i%4==j%4||i%4+j%4==3)
a[j]=n*n+1-a[j];
}
}
for(i=0; i<n; i++){
for(j=0; j<n; j++){
cout<<setw(4)<<a[j];
} cout<<endl;
}
return 0;
}