等腰三角形 蓝桥杯

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:

  1. 先用1,2,3,…的自然数拼一个足够长的串
  2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
    比如,当三角形高度是8时:
    在这里插入图片描述

输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。

为了便于测评,我们要求空格一律用"."代替。

例如:
输入:
5

程序应该输出:

在这里插入图片描述

如:
输入:
10

程序应该输出:

在这里插入图片描述
如:
输入:

15

程序应该输出:

在这里插入图片描述
存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

注意:这个用Java写代码简单,C语言就有点长

思路:要想实现这个数字等腰三角形,最难的就是,百位和十位的数字之间的分割,这里我们可以自定义q,w,count,表示百位十位和个位,再定义一个s来控制是输入百位还是十位还是个位,


#include <stdio.h>
int main()
{
 int n;
 scanf("%d", &n);
 int s = 0; //条件控制
 //这里我们不用拆分,拆分太复杂,虽然这个也不是很方便
 int q = 0, w = 0, count = 1; //q为百位,w为十位,count为个位,依靠s来控制填入
 int arr[300][600]; //待填入数组
 int p = n - 1, r = n; //数字位置下标
 //i为行,j为列 
 for (int i = 0; i < n - 1; i++)
 {
  for (int j = 0; j < r; j++)
  {
   if (j == p) 
   {
    if (s == 2) //填入百位
    {
     s = 1;
     arr[i][j] = q + '0';//这里的0是ascll码,是用ascll码代表的数来给arr[i][j]赋值的
    }
    else if (s == 1) //填入十位
    {
     s = 0;
     arr[i][j] = w + '0';
    }
    else //填入个位
    {
     arr[i][j] = count+ '0';
     count++;
     if (count == 10) //等于10时进位
     {
      count = 0;
      w++;
      if (w == 10)
      {
       w = 0;
       q++;
      }
     }
     if (w != 0) //十位不为0时开始十位个位交替填入arr如:10~13,1,0,1,1,1,2,1,3
     {
      s = 1;
     }
     if (q != 0) //百位不为0时开始百位十位个位交替填入arr
     {
      s = 2;
     }
    }
   }
   else//j==p就是到第二次循环的最后一次,所以这里只会保存j-1个. 
   {
    arr[i][j] = '.';//这是在第二个循环里面的,每一次填第一行前面的. 
   }
  }
  p--;
  r++;//这里r++是为了控制 数字里面的三角形点点 ,是为了让第二个for的j超过p,然后就可以把.填到数字的中间了
 }
 //打印底部的数字 
 for (int j = 0; j < r; j++) //n-1为行,j为列
 {
  if (s == 2)
  {
   s = 1;
   arr[n-1][j] = q + '0';
  }
  else if (s == 1)
  {
   s = 0;
   arr[n-1][j] = w + '0';
  }
  else
  {
   arr[n-1][j] = count + '0';
   count++;
   if (count == 10)
   {
    count = 0;
    w++;
    if (w == 10)
    {
     w = 0;
     q++;
    }
   }
   //当count到了10,我w等于1的时候,就是填一个个位的,填一个十位的 
   if (w != 0)
   {
    s = 1;
   }
   if (q != 0)
   {
    s = 2;
   }
  }
 }
 r--;//这里减一是为了返回倒数第二层,右边 
 //打印右边的数字 
 for (int i = n - 2; i > 0; i--) //i为行,r为列
 {
  r--;
  if (s == 2)
  {
   s = 1;
   arr[i][r] = q + '0';
  }
  else if (s == 1)
  {
   s = 0;
   arr[i][r] = w + '0';
  }
  else
  {
   arr[i][r] = count + '0';
   count++;
   if (count == 10)
   {
    count = 0;
    w++;
    if (w == 10)
    {
     w = 0;
     q++;
    }
   }
   if (w != 0)
   {
    s = 1;
   }
   if (q != 0)
   {
    s = 2;
   }
  }
 }
 r = n;
 for (int i = 0; i < n; i++) //打印二维数组
 {
  for (int j = 0; j < r; j++)
  {
   printf("%c", arr[i][j]);
  }
  printf("\n");
  r++;//这里是因为等腰数字三角形每一行比第一行多一个
 }
 return 0;
}

代码不是本人的,是在别人哪里看了,理解了再发的,来自萌新小白,嘻嘻

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值