C语言 三阶魔方阵

作者&投稿:圣削 (若有异议请与网页底部的电邮联系)
求c语言输出所有三阶魔方阵的方法,~

下面是n阶奇数魔方阵的程序,输入的数字是几,就输出几阶魔方阵:

# include
void main(){
int array[16][16];
int i, j, k, m, n;

/* 变量初始化 */
m = 1;
while(m == 1)
{
printf("请输入n(0<n<=15),n是奇数)
");
scanf("%d", &n);
/* 判断n是否是大于0小于等于15的奇数 */
if((n!=0) && (n<=15) && (n%2!=0))
{
printf("矩阵阶数是 %d
", n);
m = 0;
}
}
/* 数组赋初值为0 */
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
array[i][j] = 0;

/* 建立魔方阵 */j = n/2 + 1;
array[1][j] = 1;
for(k=2; k<=n*n; k++)
{
i = i - 1;
j = j + 1;
if((in))
{
i = i + 2;
j = j - 1;
}
else
{
if(i < 1)
i = n;
if(j > n)
j = 1;
}
if(array[i][j] == 0)
array[i][j] = k;
else
{
i = i + 2;
j = j - 1;
array[i][j] = k;
}
}

/* 输出魔方阵 */for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%5d", array[i][j]);
printf("
");
}
}

#include
#include
#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("***说明(本程序用于输出任意数阶次的魔方矩阵,其行,列,对角线之和的均值相同。)
");
printf(" ***说明(最右边的,和最下边的用于统计每行,每列的元素之和 。)

");
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((in-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("

");
}
}
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("

");
}
}
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("

");
}
}
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("

");
}
}
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((im-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((im*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((im-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((im-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阶奇数魔方阵的程序,你好好看看吧:

# include <stdio.h>

void main()

{

 int array[16][16];

 int i, j, k, m, n;

 

 /* 变量初始化 */

 m = 1;

 while(m == 1)

 {

  printf("请输入n(0<n<=15),n是奇数)
");

  scanf("%d", &n);

  /* 判断n是否是大于0小于等于15的奇数 */

  if((n!=0) && (n<=15) && (n%2!=0))

  {

   printf("矩阵阶数是 %d
", n);

   m = 0;

  }

 }

 /* 数组赋初值为0 */

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

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

   array[i][j] = 0;

 

 /* 建立魔方阵 */

 j = n/2 + 1;

 array[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(array[i][j] == 0)

   array[i][j] = k;

  else

  {

   i = i + 2;

   j = j - 1;

   array[i][j] = k;

  }

 }

 

 /* 输出魔方阵 */

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

 {

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

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

  printf("
");

 }

}

 

输入3所得到的三阶魔方阵为:

 



三阶魔方阵。用三维数组才行。你这一维怎么输出啊?


相城区13657408126: C语言 三阶魔方阵 -
乜盲小儿: 我只想说你的算法错了,你还是去查一查魔方阵的算法吧;下面是n阶奇数魔方阵的程序,你好好看看吧:# include <stdio.h> void main() { int array[16][16]; int i, j, k, m, n; /* 变量初始化 */ m = 1; while(m == 1) { printf("请输入n(0<n<=15),...

相城区13657408126: 怎么编写c语言中的三阶魔方 -
乜盲小儿: 这个打印n阶的 0<n<=15是奇数 我在下面帮你改了个3阶的/* bookp33.c 打印魔方阵程序 */ /* 谭浩强,C程序设计题解与上机指导,33页 */ /* 在tc30下编译通过 */ /* 2001.12.12 */ void main() {int a[16][16],i,j,k,p,m,n;p=1;while(p==1){ printf(...

相城区13657408126: 用C语言编写一个程序 输出魔方阵 -
乜盲小儿: #include #define n 16 //这里可以修改n的值 int main() { int a[n][n],i,j,k,p,m,n; p=1; while(p==1) /*要求阶数为1~15的商数*/ { printf("enter n(n=1~15):"); //可以输入小于等于n-1的整数 scanf("%d",&n); if((n!=0)&&(n<=n-1)&&(n%2!=0)) p=0; } for...

相城区13657408126: C语言编程,输出魔方阵 -
乜盲小儿: 程序代码: #include<stdio.h> #define N 16 int main() { int a[N][N]={0},i,j,k,p,n; p=1; while(p==1) { printf("Enter n(1~%d):",N); scanf("%d",&n); if((n!=0)&&(n<N)&&(n%2!=0)) p=0; } i=n+1; j=n/2+1; a[1][j]=1; for(k=2;k<=n*n;k++) { i=i-1; j=j+1; if((i<1...

相城区13657408126: 请哪位牛人告诉我怎样用C语言程序复原3阶魔方的 -
乜盲小儿: 对,先要了解算法最好 给你个吧,不过是有限阶的(用vc做的)#include <stdio.h> void main() { int i,j,n,k,u,t,m,x,y,a[100][100];printf("please input n:");scanf("%d",&n);printf("\n");if(n>2&&(n%2)!=0){ for(i=0;i<n;i++)for(j=0;j<n;j++)a[i][j...

相城区13657408126: C或C++编写三阶幻方 -
乜盲小儿: 它分奇偶数的. 奇数的规律比较明确,偶数也有规律. 三阶 8 1 6 3 5 7 4 9 2 五阶 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 对于三阶 数1都在第一行的正中央(1行2列),然后你往它的上一行,下一列(0行3列,由于...

相城区13657408126: c语言输出魔方阵的代码? -
乜盲小儿: 这是我写的的魔方代码,奇阶的 .#include<stdio.h> int main() {int i,j,n,a[25][25],p,k;p=0;if(p==0){ scanf("%d",&n);if(n>=1&&n<=25&&n%2==1)p=1;}for(i=1;i<=n;i++)for(j=1;j<=n;j++)a[i][j]=0;j/=2;a[1][j]=1;for(k=2;k<=n*n;k++){i--;...

相城区13657408126: 用c语言写一个输出魔方阵的程序. -
乜盲小儿: #include #define N 15 void main() {a:;int a[N][N],t;int i,j,m,n,c,b,k=1;printf("输入魔方阵阶数(不超过%d):",N);scanf("%d",&t);if(t<2||t>17){printf("输入不合法,请重新输入!\n\n");goto a;}if(t%2==0){printf("偶...

相城区13657408126: C语言奇数魔方阵 程序 -
乜盲小儿: #include#define N 5 void main() { int s[N][N],a,b,i; for(a=0,b=(N/2),i=2,s[a][b]=1;i { if(s[a][b]%N==0) a++; else { if(a-1 else a--; if(b+1==N) b=0; else b++; } s[a][b]=i; } for(a=0;a {for(b=0;b printf("%-4d",s[a][b]); printf("\n");} }

相城区13657408126: c语言中魔方阵编程的思路 -
乜盲小儿: /* 所谓魔方阵是指这样的的方阵: 它的每一行、每一列和对角线之和均相等. 输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数). 例如,当n=3时,魔方阵为:8 1 63 5 74 9 2 魔方阵中各数排列规律为: ① 将“1”放在第...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网