如何求解偶数阶魔方阵 用C语言 编写的代码

如何求解偶数阶魔方阵 用C语言 编写的代码,第1张

本人亲自写的程序,望采纳,如下:

#include<stdio.h>

int a[200][200]={0}           /*200为我自己定义的,可根据需要修改*/

void JSZ(int n)                                /*奇数魔方阵算法*/

{int p,k,i,j

 p=0k=n/2

 a[p][k]=1

 for(i=2i<=n*ni++)

  {if((i-1)%n==0)

    {if(p==n-1)p=0

     else p++

    }

   else

    {if(p==0)p=n-1

     else p--

     if(k==n-1)k=0

     else k++

 亩型   }

   a[p][k]=i

  }

}

void Ou4bZ(int n)                  /*偶数4的倍数魔方阵算法*/

{int a1[200][200],a2[200][200],i,j

 for(i=0i<ni++)

  for(j=0j<nj++)

   {if(i%4==0||(i+1)%4==0)a1[i][j]=j+1

    else a1[i][j]=n-j

   }

 for(j=0j<nj++)

  for(i=0i<ni++)

   {if(j%4==0||(j+1)%4==0)a2[i][j]=n*i

    else a2[i][j]=(n-1-i)*n

   }

 for(i=0i<ni++)

  for(j=0j<nj++)

   a[i][j]=a1[i][j]+a2[i][j]

}

void N_4OuZ(int n)                   /*偶数培旦非4的倍数魔方阵算法*/

{int s[200],x[200],z[200],y[200],i,p,k,b[200][200]={0}

 z[0]=4z[1]=10s[0]=2s[1]=9

 for(i=2i<n/2-1i++)

  {if(i%2==0)

    {z[i]=z[i-1]+1

     s[i]=s[i-1]+3

    }

   else

    {z[i]=z[i-1]+7

     s[i]=s[i-1]+5

    }

  }

 y[0]=3y[1]=5x[0]=1x[1]=6

 for(i=2i<n/2i++)

  {if(i%2==0)

    {y[i]=y[i-1]+3

     x[i]=x[i-1]+1

    }

   else

    {y[i]=y[i-1]+5

     x[i]=x[i-1]+7

    }

  }

 Ou4bZ(n-2)

 for(p=1p<n-1p++)

  for(k=1k<n-1k++)

   b[p][k]=a[p-1][k-1]+(n*n-(n-2)*(n-2))/2

 for(p=1p<n-1p++)

  for(k=1k<n-1k++)

   a[p][k]=b[p][k]

 for(i=0i<n/2-1i++)

  {a[0][i]=s[i]

   a[n-2-i][0]=z[i]

  }

 for(i=0i<n/2i++)

  {a[n-1][n-2-i]=x[i]

   a[i][n-1]=y[i]

  }

 for(i=0i<ni++)

  {if(i==0)a[n-1][0]=n*n+1-a[0][n-1]

   else if(i<n/2-1)a[n-1][i]=n*n+1-a[0][i]

   else if(i==n-1)a[n-1][n-1]=n*n+1-a[0][0]

   else a[0][i]=n*n+1-a[n-1][i]

   if(i>0&&i<n/2)a[i][0]=n*n+1-a[i][n-1]

   if(i>=n/2&&i<n-1)a[i][n-1]=n*n+1-a[i][0]

  }

}

void main()/*主函数*/

{int i,j,n

 lp:printf("JieShu(1~200): ")

 scanf("%d",&n)

 if(n<1||n==2||n>200)                /*由于没有二阶魔方阵,"n>200"为超出定义范围*/

  {printf("SCANF ERROR!\n")

   goto lp

  }

 if(n%2==0)

  {if(n%4==0)Ou4bZ(n)

   else N_4OuZ(n)

  }

 else JSZ(n)

 for(i=0i<迅中猜ni++)

  {for(j=0j<nj++)

    printf("%5d",a[i][j])

   printf("\n")

  }

 goto lp

}

#include <stdio.h>

#include <math.h>

#define N 100  /*N可以改变*/

void main()

{

  int n,p=1

void jici(int n)

  void sioubeishu(int n)

void oubeishu(int n)

void sijibeishu(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)

{

if(n==4) oubeishu(n)

else

if(fabs(n%8)<1e-006)

sioubeishu(n)

else

sijibeishu(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=2k<=n*nk++)

{

i=i-1

j=j+1

  if((i<0)&&(j>孝扮隐n-1))

  {

i=i+2j=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=0i<ni++,j++)

 {

 sum=sum+a[i][j]

 }

 a[n][n]=sum

   for(i=0i<ni++)

{

  sum=0

  for(j=0j<nj++)

  sum=sum+a[i][j]

  a[i][n]=sum

}

   for(j=0j<nj++)

{

  sum=0

  for(i=0i<ni++)

  sum=sum+a[i][j]

      a[n][j]=sum

}

   for(i=0i<n+1i++)

{

for(j=0j<n+1j++)

printf("%5d",a[i][j])

          printf("\n\n")

}

}

void oubeishu(int n)

{

int a[N][N]={0}

  int k,t,i,j,sum

k=1

  for(i=0i<ni++)

     for(j=0j<nj++)

 缺老    {

        a[i][j]=k

     k++

  }

for(i=0,j=0i<n/2i++,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-1i<n/2i++,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=0i<ni++,j++)

 {

 sum=sum+a[i][j]

 }

 a[n][n]=sum

   for(i=0i<ni++)

{

  sum=0

  for(j=0j<nj++)

  sum=sum+a[i][j]

  a[i][n]=sum

}

   for(j=0j<nj++)

{

  sum=0

  for(i=0i<ni++)

  sum=sum+a[i][j]

      a[n][j]=sum

}

   for(i=0i<n+1i++)

{

for(j=0j<n+1j++)

printf("%5d",a[i][j])

          printf("\n\n")

}

}

void sioubeishu(int n)

{

int a[N][N]={0}

  int k,t,i,j,x,y,sum

k=1

  for(j=0j<nj++)

     for(i=0i<ni++)

     {

        a[i][j]=k

     k++

  }

for(x=1x<=n/8x++)

for(y=1y<=n/4y++)

{

for(i=4*(x-1),j=4*(y-1)i<=4*x-1i++,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=4*x-1,j=4*(y-1)i>=4*(x-1)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=0i<ni++,j++)

 {

 sum=sum+a[i][j]

 }

 a[n][n]=sum

   for(i=0i<ni++)

{

  sum=0

  for(j=0j<nj++)

  sum=sum+a[i][j]

  a[i][n]=sum

}

   for(j=0j<nj++)

{

  sum=0

  for(i=0i<ni++)

  sum=sum+a[i][j]

      a[n][j]=sum

}

   for(i=0i<n+1i++)

{

for(j=0j<n+1j++)

printf("%5d",a[i][j])

          printf("\n\n")

}

}

void sijibeishu(int n)

{

int a[N][N]={0}

  int k,t,i,j,x,y,sum

k=1

  for(j=0j<nj++)

     for(i=0i<ni++)

     {

        a[i][j]=k

     k++

  }

for(x=1x<=(n-4)/8x++)

for(y=1y<=n/4y++)

{

for(i=4*(x-1),j=4*(y-1)i<=4*x-1i++,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=4*x-1,j=4*(y-1)i>=4*(x-1)i--,j++)

{

t=a[i][j]

a[i][j]=a[n-1-i][n-1-j]

              a[n-1-i][n-1-j]=t

}

}

x=(n+4)/8

for(y=1y<(n+4)/8y++)

{

for(i=4*(x-1),j=4*(y-1)i<=4*x-1i++,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=4*x-1,j=4*(y-1)i>=4*(x-1)i--,j++)

{

t=a[i][j]

a[i][j]=a[n-1-i][n-1-j]

              a[n-1-i][n-1-j]=t

}

}

y=(n+4)/8

for(i=4*(x-1),j=4*(y-1)i<=4*x-3i++,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=4*x-1,j=4*(y-1)i>=4*x-2i--,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=0i<ni++,j++)

 {

 sum=sum+a[i][j]

 }

 a[n][n]=sum

   for(i=0i<ni++)

{

  sum=0

  for(j=0j<nj++)

  sum=sum+a[i][j]

  a[i][n]=sum

}

   for(j=0j<nj++)

{

  sum=0

  for(i=0i<ni++)

  sum=sum+a[i][j]

      a[n][j]=sum

}

   for(i=0i<n+1i++)

{

for(j=0j<n+1j++)

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=2k<=m*mk++)

  {

  i=i-1

  j=j+1

  if((i<0)&&(j>m-1))

  {

      i=i+2j=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+2k<=m*3*mk++)

  {

  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+2k<=m*4*mk++)

  {

  i=i-1

  j=j+1

      if((i<m)&&(j>m-1))

  {

   i=i+2j=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+2k<=2*m*mk++)

  {

  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)/4u=n/2

     for(j=0j<t-1j++)

  for(i=0i<mi++)

  {

  h=a[i][j]

  a[i][j]=a[i+m][j]

  a[i+m][j]=h

  }

  for(j=n-t+2j<nj++)

  for(i=0i<mi++)

  {

  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=0i<ni++,j++)

 {

 sum=sum+a[i][j]

 }

 a[n][n]=sum

    for(i=0i<ni++)

 {

     sum=0

     for(j=0j<nj++)

     sum=sum+a[i][j]

     a[i][n]=sum

 }

    for(j=0j<nj++)

 {

     sum=0

     for(i=0i<ni++)

  sum=sum+a[i][j]

      a[n][j]=sum

 }

    for(i=0i<n+1i++)

 {

   for(j=0j<n+1j++)

printf("%5d",a[i][j])

          printf("\n\n")

 }

}

这个是我自己编的魔方矩阵的任意数输出程序,  用的是数组方面的内容,比较好理解

#include<stdio.h>

void main(){

int i,j,n,row,col,a[11][11]

printf("please input n:")

scanf("%d",&n)

col=n/2//

row=0//

for(i=1i<=n*ni++){ //答局i<=n*n,楼主写错了,如果想保持为<可做相应修改

if(row==-1) // 不明白再联系吧

row=n-1

if(col==n)

col=0 //禅帆

a[row][col]=i//

if(i%n==0)

row++

else{

row--

col++

}

}

for(i=0i<ni++){

for(j=0j<nj++)

printf("贺举雹%10d",a[i][j])

printf("\n")

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12441316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存