当前位置:首页 » 编程语言 » 谭浩强c语言魔方阵代码看不懂
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

谭浩强c语言魔方阵代码看不懂

发布时间: 2022-06-13 21:35:00

⑴ 谭浩强c语言课后题(魔方阵)求助

#include<stdio.h>
void 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))
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;//将1放在第一行第一列
//摆放位置的设置
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(i>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("%4d",a[i][j]);
printf("\n");
}
}

⑵ C语言,写的魔方阵 下面代码虚线里的看不懂,说下是什么原理,菜鸟求教。。。

(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

⑶ c语言输出魔方阵程序解释

首先魔方阵是一个奇数行列式方阵,它的一行,一列,对角线的和都相等。
建立魔方阵的第一步是确定1的位置,它是第一行的中间列,之后要确定其他位置的值,
问题1:if((i<1)&&(j>n))时,说明你确定的位置已经超出了魔方阵,所以要用i=i+2;j=j-1;把它拉回的魔方阵内,
问题2:判断第i行地j列的值是否等于0(即是否被填充),如果没填充,就填k,如果填充,再寻找下一个位置,
问题3:因为你的主函数main()前面的返回值为int,所以要提供返回值,那不是return=0,而是return 0;就是返回0,也可以返回1,这没关系的,如果不想要也行,那得把main()前面的int 改为void .

⑷ 魔方阵的C语言

代码一:
#include <stdio.h>
#define N 16 //这里可以修改N的值,并且N只能为偶数
int main()
{
int a[N][N]={0},i,j,k,p,m,n;
p=1;
while(p==1)
{
printf(Enter n(1~%d): ,N-1);/*可以输入小于等于N-1的奇数*/
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)&&(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(%4d,a[i][j]);
printf( );
}
}
代码二:(相对于代码一条理更清晰,更简单、更容易理解)
将1~n的平方这几个数构成一个n阶魔方阵。
算法:
依以下法则,你可以很快的写出奇数阶幻方!当然,这种写法只是其中一个答案,而不是唯一答案。
1)将1填入第一行中间;
2)将每个数填在前一个数的右上方。
3)若该位置超出最上行,则改填在最下行的对应位置;
4)若该位置超出最右列,则该填在最左列的对应行位置;
5)若某元素填在第一行最右列,下一个数填在该数同列的下一行;
6)若某数已填好,但其右上角已填了其他数据,则下一个数填在该数同列的下一行位置。
#include<stdio.h>
void main()
{
int a[15][15]={0},i,j,m,n,temp,M;
printf(请输入一个3~15的奇数: );
scanf(%d,&M);
i=0;
j=M/2;
a[i][j]=1;
for(temp=2;temp<=M*M;temp++)
{
m=i;
n=j;
i--;
j++;
if(i<0)
i=M-1;
if(j>M-1)
j=0;
if(a[i][j]!=0)
{
i=m+1,j=n;
a[i][j]=temp;
continue;
}
a[i][j]=temp;
}
printf(%d×%d魔方阵: ,M,M);
for(i=0;i<M;i++)
{
for(j=0;j<M;j++)
printf(%4d,a[i][j]);
printf( );
}
}
//(求4的倍数阶幻方)
void main()
{
int i,j,x,y,n,t,k=1;
int a[100][100];
printf(请输入魔方阵的阶数n );
scanf(%d,&n);
printf(输出为: );
if(n%4==0)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a[i][j]=k;
k++;
}
x=n-1;
for(j=0;j<n/2;j++,x--)
{
for(i=0;i<n;i++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[i][x];
a[i][x]=t;
}
}
x=n-1;
for(i=0;i<n/2;i++,x--)
{
for(j=0;j<n;j++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j];
a[i][j]=a[x][j];
a[x][j]=t;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf(%-4d,a[i][j]);
printf( );
}
}
else printf(输入错误 );
system(pause...);
}

⑸ C语言:输出魔方阵

魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

⑹ 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--;
j++;
if(i<1&&j>n)
{
i+=2;
j--;
}
else
{
if(i<1)
i=n;
if(j>n)
j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i+=2;
j--;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return p;
}

⑺ C语言关于打印n阶魔方阵的编程有几个看不懂的,,求指点啊

幻方是可以构造的
分为奇数阶、双偶阶、偶数阶三种情况
具体可以参考网络
p==1表示true,为真也就是一直循环,直到p变成0

⑻ 关于C++:要求输出一个n*n魔方阵(每行每列及对角线之和相等),其中n由键盘输入 看不懂标准答案,哪位...

这个帖子里面 讲了你要的 思路,你看看:

http://..com/question/124807422

⑼ C语言编程,输出魔方阵

程序代码:

#include&lt;stdio.h&gt;

#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&lt;N)&&(n%2!=0))

p=0;

}

i=n+1;

j=n/2+1;

a[1][j]=1;

for(k=2;k&lt;=n*n;k++)

{

i=i-1;

j=j+1;

if((i&lt;1)&&(j&gt;n))

{

i=i+2;

j=j-1;

}

else

{

if(i&lt;1)i=n;

if(j&gt;n)j=1;

}

if(a&lt;i&gt;[j]==0)a&lt;i&gt;[j]=k;

else

{

i=i+2;

j=j-1;

a&lt;i&gt;[j]=k;

}

}

for(i=1;i&lt;=n;i++)

{

for(j=1;j&lt;=n;j++)

printf("%4d",a&lt;i&gt;[j]);

printf(" ");

}

return 0;

}

(9)谭浩强c语言魔方阵代码看不懂扩展阅读:

1.第一行中间一列的值为1。

所以用j=n/2+1确定1的列数,得出a[1][j]=1。

2.每一个数存放的行比前一个数的行数减1,列数加1。

行数用i=i-1确定,列数用j=j+1确定。

3.如果一个数行数为第一行,则下一个数行数为最后一行。

4.如果一个列行数为最后一列,则下一个数列数为第一列。

5.如果按上面的规则确定的位置上已有数,或上一个数是第一行最后一列,则把下一个数放在上一个数的下面。