问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-07-05 07:02

我来回答

3个回答

热心网友 时间:2024-11-26 15:54

#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");

 }

}

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

热心网友 时间:2024-11-26 15:55

#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;
}

热心网友 时间:2024-11-26 15:55

qwertyuiop
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你家的水龙头起泡器该换了 如何打开水龙头起泡器 网上卖门锁,安装如何解决 广告装潢需要哪些设备 广告制作需要哪些材料 开锦旗招牌广告制做店须要什么 广告店需要哪些耗材 长安之星发动机水泵要坏之前声音怎么判断 家有孕妇咋调理:280天贴心呵护生健康宝贝图书信息 哪些是适合孕妇看的书 三阶魔方矩阵是几维的 田和唐两字组词父亲姓田,母亲姓唐。想给女儿起个名 建行营运主管交流发言稿 父是多音字吗 学习如何当好一线主管发言稿怎么写 范文 蛋炒饭步骤,蛋炒饭步骤怎么做? 卫生间 马桶正对门怎么破解? 元宵节是不是中国情人节? 元宵节是不是中国的情人节 养肺的食物有些什么? 究竟元宵还是七夕才是中国的情人节阿 到底是电热水器好还是燃气热水器安全性高呢? 七夕和元宵,哪个是正宗情人节? DELL 380型号台式机最高能升级到什么配置? 戴尔OPT380多少钱 七夕和元宵究竟哪个作为中国情人节更为合适? 以瘦字开头的成语 用于市场调查中的定量数据插补的方法有很多种其中稳定性较好的是_百... 请教;各路高人,做窗帘幔子尺寸如何计算 这样的翡翠吊坠多少钱能入手? 阳光的快乐生活第五部的插曲有哪些 阳光的快乐生活主题曲叫什么? 阳光快乐生活第五部插曲 《阳光快乐生活4》有个插曲叫(兄弟)的歌词 阳光的快乐生活7中插曲叫什么? 阳光的快乐生活全集歌曲 阳光快乐生活中有首歌为&quot;一个人的时候,你别瞎琢磨...&quot;的歌曲名字是嘛了... 三八妇女节……该不该给女朋友发红包。。 38妇女节女朋友还没结婚能不能发红包? 三八妇女节应该给女朋友发多少红包 为什么玩电脑的时候右侧的肩膀那么疼啊? 江西特产哪里买? 苹果11手机搜不到蓝牙设备?找不到设备号怎么办?- 问一问 38妇女节给女朋友发多少红包才合适?谢谢 三八妇女节给情人发多少红包? 我劳动我充实道德实践作业吧 酒红色马丁靴怎么搭配大衣 14孔酒红色马丁靴配什么衣服? 大家帮我瞧瞧,这大衣能不能配酒红色的鞋? ...五四运动、八一南昌起义,胜利渡长江分别发生在哪一年