C语言编程,输出魔方阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程,输出魔方阵相关的知识,希望对你有一定的参考价值。

这个是输出魔方阵的C语言程序,但是中间的算法我搞不明白
求大神给注释一下主要的算法和中间的循环
#include <stdio.h>
void main()

int a[15][15];
int i,j,k,p,n;
p=1;
while (p=1)

printf("请输入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;
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");

printf("\n\n");



程序代码:

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

return 0;

扩展资料:

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

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

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

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

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

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

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

参考技术A

源代码如下:

#include<stdio.h>

#define N 5

int main()

int a[N][N]=0, i, j, k, t, x, y;

i=0; /*自然数1的行标*/

j=N/2; /*自然数1的列标*/

t=N-1; /*最后一行、最后一列的下标*/

for(k=1; k<=N*N; k++)

a[i][j]=k;

x=i;

y=j;

if(i == 0)

i=t;

else

i=i-1;

if(j != t)

j=j+1;

else

j=0;

if(a[i][j]!=0)

i=x+1;

j=y;

printf("生成的5-魔方阵为:");

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

printf("\\n");

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

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

printf("\\n");

return 0;

扩展资料

1、由于一个整型数要占用两个内存,因此,如果魔方阵中要存放的数有max个,则分配内存时要分配2*max个单元,从而有malloc(max+max)。在malloc()函数中使用max+max而不是2*max是考虑了程序运行的性能。

2、内存是一维线性的,因此在存取数组元素时,要将双下标转换为单个索引编号。在程序中直接定义了指针变量来指向数组空间,即使用malloc()函数分配的内存。

参考技术B 你好,首先你要搞清楚魔方阵的排列规律,我看了下你的程序,只是针对奇数来排列的,而魔方阵的奇数排列规律就是:
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向向右上走,每一个数存放的行比前一个数的行数减1,列数加1;
(3) 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
又如某个数在第n列,则下一个数应放在第一列,行数同样减1;
(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。

知道了排列规律,就好办了,程序注释如下:
#include <stdio.h>
void main()

int a[15][15];
int i,j,k,p,n;
p=1;
while (p=1) //我觉得这里应该是p==1,否则p=1是赋值语句,导致while判断没有效果,会一直循环

printf("请输入n,(n=1—15):");
scanf("%d",&n);

if((n!=0)&&(n<=15)&&(n%2!=0)) //这里就是判断是否为1至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; //这里是将1放在矩阵的第一行的中间位置
for(k=2;k<=n*n;k++)

i=i-1;
j=j+1; // 从2开始直到n×n止各数依次按下列规则存放:按 45°向右上方向行走,也即行数减一,列数加一
if((i<1)&&(j>n)) //这里是判断是否到了第1行第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");

printf("\n\n");

参考技术C

下面运行通过,只不过不知道是否符合你的格式,代码如下:

#include<stdio.h>

void main()

int num=-1;

int q=0,t[5];

int a=0,b=0,c=0,d=0,e=0;

int i=0,j=0;

int count=0,temp=0;

char p;

printf("***********************************************\\n");

printf("(1、赵**  2、钱**  3、孙**   4、李**  5、周**)\\n");

while(num!=6)

 

 printf("请输入选号:"); 

 scanf("%d",&num);

  if(num==0)

   q++;

  else

   switch(num)

    

    case 1:a++;break;

    case 2:b++;break;

    case 3:c++;break;

    case 4:d++;break;

    case 5:e++;break;

    default:break;

    

 

count=a+b+c+d+e+q;

t[0]=a;

t[1]=b;

t[2]=c;

t[3]=d;

t[4]=e;

printf("hello\\n");

printf("赵有%d票\\n钱有%d票\\n孙有%d票\\n李有%d票\\n周有%d票\\n弃权有%d票\\n总共有%d人投票(包括弃权的)\\n",a,b,c,d,e,q,count);

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

 for(j=0;j<5-i;j++)

  if(t[j]<t[j+1])  /*选票排序*/

   

    temp=t[j];

    t[j]=t[j+1];

    t[j+1]=temp;

   

for(i=0;i<3;i++)  /*输出前三甲*/ 

 

  if(t[i]==a)

   printf("赵 是第%d名,共%d票\\n",i+1,a);

  if(t[i]==b)

   printf("钱 是第%d名,共%d票\\n",i+1,b);

  if(t[i]==c)

   printf("孙 是第%d名,共%d票\\n",i+1,c);

  if(t[i]==d)

   printf("李 是第%d名,共%d票\\n",i+1,d);

  if(t[i]==e)

   printf("周 是第%d名,共%d票\\n",i+1,e);

 

运行结果如图:

参考技术D 你好,首先你要搞清楚魔方阵的排列规律,我看了下你的程序,只是针对奇数来排列的,而魔方阵的奇数排列规律就是:
(1)
将1放在第一行中间一列;
(2)
从2开始直到n×n止各数依次按下列规则存放:

45°方向向右上走,每一个数存放的行比前一个数的行数减1,列数加1;
(3)
如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
又如某个数在第n列,则下一个数应放在第一列,行数同样减1;
(4)
如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
知道了排列规律,就好办了,程序注释如下:
#include
<stdio.h>
void
main()

int
a[15][15];
int
i,j,k,p,n;
p=1;
while
(p=1)
//我觉得这里应该是p==1,否则p=1是赋值语句,导致while判断没有效果,会一直循环

printf("请输入n,(n=1—15):");
scanf("%d",&n);
if((n!=0)&&(n<=15)&&(n%2!=0))
//这里就是判断是否为1至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;
//这里是将1放在矩阵的第一行的中间位置
for(k=2;k<=n*n;k++)

i=i-1;
j=j+1;
//
从2开始直到n×n止各数依次按下列规则存放:按
45°向右上方向行走,也即行数减一,列数加一
if((i<1)&&(j>n))
//这里是判断是否到了第1行第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");

printf("\n\n");

用c语言求一个n阶方阵的所有元素之和,并给出算法的时间复杂度

参考技术A #include <stdio.h>
#include <stdlib.h>
#define N 3
int main(void)

int a[N][N] = 1,2,3,4,5,6,8,7,9;
int iterx = 0, itery = 0;
int sum = 0;
for(iterx = 0; iterx < N; iterx++)

for(itery = 0; itery < N; itery++)

sum += a[iterx][itery];


printf("the sum is %d\n", sum);
return 0;

时间复杂度O(N的平方)!遍历整个矩阵,肯定要把所有元素走一遍。追问

谢谢

本回答被提问者采纳

以上是关于C语言编程,输出魔方阵的主要内容,如果未能解决你的问题,请参考以下文章

求c语言输出所有三阶魔方阵的方法,

魔方阵的C语言

求助C语言高手,关于魔方矩阵的问题

C语言编程:N*N方阵的转置

用c语言求一个n阶方阵的所有元素之和,并给出算法的时间复杂度

魔方阵算法