数字顺时针三角形
数字排列。初一看,总会觉得毫无头绪,但作为程序员的我们,都是热爱编程的人,面对困难我们总是最冷静的。这道题可以用递归的题做,但我个人觉得递归不能体现自己编程能力,所以我放弃了这种想法。非递归是我的选择,于是我就分析问题的本质,首先这是三角形的组合,我所想到的是分解三角形的边,利用3个函数来解析这3条边,于是我就开始了这道题,首先我就想到给出一个数字我们就能确定最多层,按层的方式,将数字存入二维数组中。首先看一段代码:
#include"stdio.h"
#include"string.h"
int a[21][21]; // 定义二维数组,来存储这个数据
int quan=1,quanmax=1; // 定义一个圈的变量quan 并求出这个圈的最大圈quanmax
int n; // 输入数
int hb=0,sb=0,xb=0; // 函数的返回值,这三个值是重要的变量,扮演这维数的进行
三个函数代码:
int hh() // 横向进行
{
int j=1;
if(quan == 1) // 第一圈是一个重要的进入点
{
for(;j<=n;j++)
{
a[quan][j] = j;
}
return n; // 第一圈结束 返回最后的结束值
}
else
{
for(;j<=n-3*(quan-1);j++)
{
a[quan][quan+j-1] = sb+j;
}
return a[quan][quan+j-2]; // 返回最后一个值,为进行下一个边做好准备
}
}
int xh() // 斜向进行
{
int j=1;
for(;j<=n-1-3*(quan-1)&&quan<=quanmax;j++)
{
a[quan+1+j-1][n-1-2*(quan-1)-j+1] = hb+j;
}
if(j>(n-1-3*(quan-1)))
return hb+j-1;
else
return hb+j;
}
int sh() // 竖向进行
{
int j=1;
int k = n-2-3*(quan-1);
for(;j<= k &&quan<=quanmax;j++)
{
a[quan+k-j+1][quan] = xb+j;
}
if(j>(n-2-3*(quan-1)))
return xb+j-1;
else
return xb+j;
}
主函数调用:
void main()
{
for(int i=0;i<=20;i++)
{
for(int j=0;j<=20;j++)
{
a[i][j] = 0;
}
}
printf("please input a num(num<=20):");
scanf("%d",&n);
int k = n/3;
int ys = n%3;
if(ys == 0)
quanmax = k;
else
quanmax = k+1;
for(i=1;i<=quanmax;i++)
{
hb = hh();
xb = xh();
sb = sh();
quan++;
}
for(i=1;i<=20;i++)
{
for(int j=1;j<=20;j++)
{
if(a[i][j] == 0)
{
printf("\n");
break;
}
else
printf("%6d",a[i][j]);
}
}
getchar();
}
运行截图:
上面的代码是我自己第一时间编写的,经过自己一段时间的思考,我简化了代码,具体代码如下:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int a[21][21]; // 定义二维数组,来存储这个数据
int quan=1,quanmax=1; // 定义一个圈的变量quan 并求出这个圈的最大圈quanmax
int n,m=1; // 输入数
void san()
{
int j=1;
for (;j<=n-3*(quan-1);j++) // 横向边
a[quan][quan+j-1] = m++;
for (j=1;j<=n-1-3*(quan-1)&&quan<=quanmax;j++) // 斜向边
a[quan+1+j-1][n-1-2*(quan-1)-j+1] = m++;
for (j=1;j<= n-2-3*(quan-1) &&quan<=quanmax;j++) // 竖向边
a[quan+n-2-3*(quan-1)-j+1][quan] = m++;
}
void main()
{
printf("please input a num(num<=20):");
scanf("%d",&n);
if(n>20 || n<=0)
{
printf("ERROR!");
exit(0);
}
int k = n/3;
int ys = n%3;
if(ys == 0) // 最大的圈值,也就是3角形的个数
quanmax = k;
else
quanmax = k+1;
for (k=1;k<=quanmax;k++)
{
san();
quan++;
}
for(k=1;k<=20;k++)
{
for(int j=1;j<=20;j++)
{
if(a[k][j] == 0)
{
printf("\n");
break;
}
else
printf("%6d",a[k][j]);
}
if(j == 21)
printf("\n");
}
getchar();
getchar();
}
这段代码看懂不是很难,与之前的相比,代码简化了许多,思路也很清晰,运行截图: