深夜手撕三角

简介: 深夜手撕三角

在c语言中会用for循环干很多很多事情,今天要分享大家的是通过for循环打印出两个靠在一起的三角形,那我为什么不说是菱形呢?嘿嘿,我在点题呀,还有就是著名的杨辉三角问题

杨辉三角

杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为1;每个数等于它左上方和上方的两数之和。

怎么用c语言实现杨辉三角呢???

图1

这个是最后要实现的效果。

如果我去掉打印中的空格的话,是下面的效果

图3

数字的位数可能不一样看不太清楚,如果每个数字都一样是怎么样的??

图4

从这里可以看出我们可以把数据放在一个二维数组里面。比如打印出图4那样

int main()

{

int arr[10][10] = { 0 };

int i = 0;

for (i = 0; i <10; i++)
{
  int j=0;
  for (j = 0; j <=i; j++)    //这里j<=i就是为了打印主对角线下方的数据
  {
    printf("%d ", arr[i][j]);
  }
  printf("\n");
}

}

根据图3可知二维数组的第一列都是1,主对角线也都是1,代码实现如下

int main()

{

int arr[10][10] = { 0 };

int i = 0;

for (i = 0; i < 10; i++)
{
  int j = 0;
  for (j = 0; j < 10; j++)
  {
    if(j == 0)//如果是第一列赋值为1
    {
      arr[i][j] = 1;
    }
    if (i==j)//如果是主对角线赋值为1
    {
      arr[i][j] = 1;
    }
    }

}

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

{

int j=0;

for (j = 0; j <=i; j++)
  {
    printf("%d ", arr[i][j]);
  }
  printf("\n");
}

}

打印结果如下

但是这个图片和图三还有差异,对比发现,要实现杨辉三角的数据的话,

下面这个红圈的数据应该是上面红圈两个数据的和也就是arr[2][1]=arr[1][1]+arr[1][0];

arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];`
int main()
{
  int arr[10][10] = { 0 };
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    int j = 0;
    for (j = 0; j < 10; j++)
    {
      if(j == 0)
      {
        arr[i][j] = 1;
      }
      if (i==j)
      {
        arr[i][j] = 1;
      }
      if (i >= 1 && j >= 1)
      {
        arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
        }
}
  for (i = 0; i <10; i++)
  {
    int j=0;
    for (j = 0; j <=i; j++)
    {
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }
}

现在才得到了图三的结果,为了出现三角的形状,开始加空格,

在每一行打印前加空格,每行的空格数递减,我们可以通过循环实现

int main()
{
  int arr[10][10] = { 0 };
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    int j = 0;
    for (j = 0; j <=i; j++)
    {
      if (j == 0)
      {
        arr[i][j] = 1;
      }
      if (i == j)
      {
        arr[i][j] = 1;
      }
      if (i >= 1 && j >= 1)
      {
        arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
      }
    }
  }
    for (i = 0; i < 10; i++)
    {
      int j = 0;
      for (int k = 0; k < 10 - i; k++)//循环打印空格,空格数随着行数递减,i越大循环次数越小,打印空格越少,最后保证在最后一行i=9时,前面有一个空格,这里的循环判断可以写k < 10 - i
    {
      printf("  ");//两个空格
    }
      for (j = 0; j <=i; j++)
      {
        printf("%3d", arr[i][j]);
      }
      printf("\n");
    }
  }
printf("  ");//两个空格
```c
在这里插入代码片
printf("%3d ", arr[i][j]);

这样打印的话会好看一点

# 打印菱形
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/41cfb3f89f6c4c389ffe4684d3c659fa.png#pic_center)
这个菱形的打印我们可以分为上半部分和下半部分,可以从键盘输入上面的三角为n行,而下面的三角则为n-1行,我们先实现上半部分
```c
int n = 0;
  scanf_s("%d", &n);//通过键盘输入n行
  for (int i = 1; i <= n; i++)//循环遍历每一行
  {
    int j = 0;
    for (j = 0; j < n - i; j++)//为了使上半部分最后一行刚好与左边界对齐,循环判断条件为j < n - i当i==n时刚好打印空格的循环不进行循环,从第一行往下每一行少打印一个空格
    {
      printf(" ");
    }
    for (int k = 0; k < 2 * i - 1; k++)//打印*,观察规律打印*次数与行数有关,i为行数,*的数目为2*i-1
    {
      printf("*");
    }
    printf("\n");每一行结束打印换行
  }

输入n=7,上半部分七行,

下面的n-1行用类似的方法

、`for (int i = 1; i <= n - 1; i++)//循环遍历下部分n-1行

{
  int j = 0;
  for (j = 0; j < i; j++)//为了和上面对称,并且空格的数目递增,1, 2 ,3这样增加,可以把循环条件与i联系起来,i每次jia1,j就可以多循环1次,多打印一个空格,循环判断条件可以写成j < i
  {
    printf(" ");
  }
  for (int q = 0; q < 2 * (n - 1 - i) + 1; q++)//根据下面打印的结果,下面第一行打印的应该是11个*,n=7,n-1=6,打印的次数为2*(n-1)-1吗??因为打印的*的次数每一行时变化的,所以应该和i这个变化的行数结合起来,下面第一行i=1;这一行打印了2*(n-1-i)+1次,
  {
    printf("*");
  }
  printf("\n");
}

整体代码

int main()
{
  int n = 0;
  scanf_s("%d", &n);
  for (int i = 1; i <= n; i++)
  {
    int j = 0;
    for (j = 0; j < n - i; j++)
    {
      printf(" ");
    }
    for (int k = 0; k < 2 * i - 1; k++)
    {
      printf("*");
    }
    printf("\n");
  }
  for (int i = 1; i <= n - 1; i++)
  {
    int j = 0;
    for (j = 0; j < i; j++)
    {
      printf(" ");
    }
    for (int q = 0; q < 2 * (n - 1 - i) + 1; q++)
    {
      printf("*");
    }
    printf("\n");
  }}

通过for循环可以打印好多好看的图案,除了上面的三角图案,希望大家多多支持,如果有不对的地方,请大佬多多指教,谢谢大家了

目录
相关文章
|
Cloud Native
【刷题日记】473. 火柴拼正方形
本次刷题日记的第 52 篇,力扣题为:473. 火柴拼正方形,中等
|
6月前
|
搜索推荐
手撕各种排序(中)
手撕各种排序(中)
65 0
|
6月前
|
算法 搜索推荐 索引
手撕各种排序(下)
手撕各种排序(下)
59 0
|
6月前
|
安全 Java C语言
手撕各种排序(上)
手撕各种排序
50 0
|
缓存 调度
手撕代码系列(四)
手撕代码系列(四)
|
算法 程序员
手撕代码
手撕代码是什么
|
C语言
【每日一道智力题】之高楼扔只因蛋
【每日一道智力题】之高楼扔只因蛋
167 0
|
移动开发 前端开发 JavaScript
前端|画个火柴人
前端|画个火柴人
306 0