c语言 如何求三阶魔方阵,最好带注释

如题所述

#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=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 oubeishu(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 sioubeishu(int n)

{  

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

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

k=1;

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

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

       {

          a[i][j]=k;

     k++;

  }

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

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

{

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;

}

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=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 sijibeishu(int n)

{  

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

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

k=1;

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

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

       {

          a[i][j]=k;

     k++;

  }

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

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

{

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;

}

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=1;y<(n+4)/8;y++)

{

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;

}

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-3;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=4*x-1,j=4*(y-1);i>=4*x-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");

 }

}

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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-24
#define N 3
#include<stdio.h>
void main()
{
  int a[N][N],i,j,k;
  for(i=0;i<N;i++)    /*先处理第一行*/
    for(j=0;j<N;j++)
    {
      a[i][j]=0;     /*先令所有元素都为0*/
    }
      j=(N-1)/2;     /*判断j的位置*/
      a[0][j]=1;    /*将1放在第一行中间一列*/
  for(k=2;k<=N*N;k++)    /*再从2开始处理*/
    {
      i=i-1;    /*存放的行比前一个数的行数减1*/
      j=j+1;    /*存放的列比前一个数的列数加1*/
      if((i<0)&&(j==N))    /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/
      {
        i=i+2;
        j=j-1;
      }
      else
      {
        if(i<0)    /*当行数减到第一行,返回到最后一行*/
        i=N-1;
        if(j>N-1)    /*当列数加到最后一行,返回到第一行*/
        j=0;
      }
      if(a[i][j]==0)     /*如果该元素为0,继续执行程序*/
        a[i][j]=k;
      else   /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
      {
        i=i+2;
        j=j-1;
        a[i][j]=k;
      }
    }
    for(i=0;i<N;i++)    /*输出数组*/
    {
      for(j=0;j<N;j++)
      printf("%5d",a[i][j]);
      printf("\n\n");
    }
  }

方法2:
#include <stdio.h>
int main()
{
int a[16][16],i,j,k,p,n;
p=1;
while(p==1)
  {
   printf("enter n(n=1--15):");
scanf("%d",&n);
if ((n!=0) && (n<=15) && (n%2!=0)) /*能求15阶奇数魔方阵*/
p=0;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[1][j]=1;
for (k=2;k<=n*n;k++)
  {
   i=i-1;
j=j+1;
if ((i<1) && (j>n))
{i=i+2;
j=j-1;
}
else
{
if (i<1) i=n;
if (j>n) j=1;
}
if (a[i][j]==0)
a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for (i=1;i<=n;i++) /*输出数组*/
   {
   for (j=1;j<=n;j++)
printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}
第2个回答  2013-11-24
qwertyuiop
相似回答