蓝桥杯-试题-数字三角形-代码精简

来源:互联网 发布:电工模拟仿真软件 编辑:程序博客网 时间:2024/06/06 19:55

数字顺时针三角形

数字排列。初一看,总会觉得毫无头绪,但作为程序员的我们,都是热爱编程的人,面对困难我们总是最冷静的。这道题可以用递归的题做,但我个人觉得递归不能体现自己编程能力,所以我放弃了这种想法。非递归是我的选择,于是我就分析问题的本质,首先这是三角形的组合,我所想到的是分解三角形的边,利用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();
}


这段代码看懂不是很难,与之前的相比,代码简化了许多,思路也很清晰,运行截图:


原创粉丝点击