永发信息网

用C语言编一个简单的程序来判断N×N的矩阵是否为一个幻方。

答案:2  悬赏:40  手机版
解决时间 2021-12-01 07:49
  • 提问者网友:椧運幽默
  • 2021-11-30 17:28
用C语言编一个简单的程序来判断N×N的矩阵是否为一个幻方。
最佳答案
  • 五星知识达人网友:掌灯师
  • 2021-11-30 18:15
#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      for(j=0; j        a[i][j+k]=a[i][j]+2*k*k;
        a[i+k][j]=a[i][j]+3*k*k;
        a[i+k][j+k]=a[i][j]+k*k;
      }
    t=(n-2)/4;
    for(i=0; i      for(j=0; j        if((j          p=a[i][j];
          a[i][j]=a[i+k][j];
          a[i+k][j]=p;
        }if((jk-t-1)){
          p=a[i][j];
          a[i][j]=a[i+k][j];
          a[i+k][j]=p;
        }if((i>=t&&i<=k-t-1)&&(j>=t&&j          p=a[i][j];
          a[i][j]=a[i+k][j];
          a[i+k][j]=p;
        }if(j>1&&j<=t){
          p=a[i][j+k];
          a[i][j+k]=a[i+k][j+k];
          a[i+k][j+k]=p;
        }
      }
  }
  if(n%4==0) { //双偶数幻方
    x=1;
    for(i=0; i      for(j=0; j        a[i][j]=x++;
    for(i=0; i      for(j=0; 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      for(j=0; j        printf("%5d",a[i][j]);
      printf("
");
    }
  }
}
int check(int n) { //检验是否是幻方
  int i,j,sum1=0,sum2;
  for(i=0; i    for(j=0; j      sum1+=a[i][j];
    if(sum1!=sum)
      return 0;
    sum1=0;
  }
  for(i=0; i    for(j=0; j      sum1+=a[i][j];
    if(sum1!=sum)
      return 0;
    sum1=0;
  }
  for(sum1=0,sum2=0,i=0,j=0; i    sum1+=a[i][j];
    sum2+=a[i][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;
    }
  }
}
// c++语言实现
//(1)求奇数幻方
#include
#include
 
int main(){
  int n,x,y,tot=0,i,j,a[100][100]={0};
  cout<<"请输入一个奇数"<  cin>>n;
  a[i=n/2][j=0]=++tot;
  i--;
  j--;
  while(tot<=n*n){
    i<0?i=n-1:i=i;
    j<0?j=n-1:j=j;
    if(a[i][j]){
      i=x;
      j=y+1;
    }
    a[i][j]=++tot;
    x=i;
    y=j;
    i--;
    j--;
  }
  for(i=0; i    for(j=0; j      cout<  }
  return 0;
}
//(2)求单偶幻方
#include
#include
 
int main(){
  int n,i=0,j=0,a[100][100],tot=0;
  cout<<"请输入4的倍数"<  cin>>n;
  for(i=0; i    for(j=0; j      a[i][j]=++tot;
    }
  for(i=0; i    for(j=0; j      if(i%4==j%4||i%4+j%4==3)
        a[i][j]=n*n+1-a[i][j];
    }
  }
  for(i=0; i    for(j=0; j      cout<    cout<  }
  return 0;
}追问大哥重写,我的要求没那么复杂,幻方不分奇偶,只要是简单的判断是不是幻方就行了。
全部回答
  • 1楼网友:上分大魔王
  • 2021-11-30 18:54
没错
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯