用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;
}追问大哥重写,我的要求没那么复杂,幻方不分奇偶,只要是简单的判断是不是幻方就行了。
#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
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
a[i][j]=a[i+k][j];
a[i+k][j]=p;
}if((j
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
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(i=0; i
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
printf("
");
}
}
}
int check(int n) { //检验是否是幻方
int i,j,sum1=0,sum2;
for(i=0; i
if(sum1!=sum)
return 0;
sum1=0;
}
for(i=0; i
if(sum1!=sum)
return 0;
sum1=0;
}
for(sum1=0,sum2=0,i=0,j=0; i
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<<"请输入一个奇数"<
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
return 0;
}
//(2)求单偶幻方
#include
#include
int main(){
int n,i=0,j=0,a[100][100],tot=0;
cout<<"请输入4的倍数"<
for(i=0; i
}
for(i=0; i
a[i][j]=n*n+1-a[i][j];
}
}
for(i=0; i
return 0;
}追问大哥重写,我的要求没那么复杂,幻方不分奇偶,只要是简单的判断是不是幻方就行了。
全部回答
- 1楼网友:上分大魔王
- 2021-11-30 18:54
没错
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯