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<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)&&(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("\\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()函数分配的内存。
(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语言编程,输出魔方阵的主要内容,如果未能解决你的问题,请参考以下文章