深夜手撕三角

简介: 深夜手撕三角

在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循环可以打印好多好看的图案,除了上面的三角图案,希望大家多多支持,如果有不对的地方,请大佬多多指教,谢谢大家了

目录
相关文章
|
SQL 存储 关系型数据库
MySQL主从复制之原理&一主一从部署流程—2023.04
MySQL主从复制之原理&一主一从部署流程—2023.04
1709 0
|
Java Windows
documents4j 文档转换
documents4j 文档转换
|
存储 缓存 Java
Infinispan篇(一):一个被遗忘了的分布式集群缓存系统
Infinispan 是一个开源内存数据网格,提供灵活的部署选项和强大的数据存储、管理和处理功能。
2681 0
|
数据可视化 网络安全 数据安全/隐私保护
Dokcer进阶 Docker配置可视化面板 Portainer可视化面板安装
容器可视化界面安装配置,以及可视化界面的一些基础操作,以及命令详解
1905 0
Dokcer进阶 Docker配置可视化面板 Portainer可视化面板安装
|
10月前
|
存储 关系型数据库 分布式数据库
PolarDB PG 版冷热数据分层功能介绍
本文介绍了云原生数据库PolarDB PG版的冷热数据分层存储功能,涵盖其原理、特性及最佳实践。冷热分层存储通过将冷数据归档至OSS(对象存储服务),实现低成本高效存储,同时保持SQL操作透明性和性能优化。支持多种分层模式,如表与索引分层、大字段独立归档等,并提供压缩和缓存机制以提升访问速度。此外,还介绍了如何通过DDL语句轻松转存数据至OSS,以及一系列最佳实践,包括自动冷热分层、无锁表转存和一键转存等功能。
631 36
|
11月前
|
缓存 人工智能 程序员
CodeFuse「编码挑战季」:冲刺最后1个月!MelGeek磁轴键盘、Beats耳机等你来拿~
从1024程序员节起至12月底,CodeFuse「编码挑战季」火热进行中!参与muAgent、MFTCoder、ModelCache、CodeFuse-IDE四个项目的编码挑战,不仅能够深化对CodeFuse项目及开源社区的理解,还能赢取定制周边及高端奖品,如MelGeekMADE68 PRO磁轴键盘、Beats Studio Pro无线蓝牙耳机等。活动期间,开发者可根据任务难度获取积分,兑换丰富奖品。立即加入,让我们一起探索技术的无限可能!
195 11
|
前端开发
react antd点击table行时加选中背景色
react antd点击table行时加选中背景色
291 5
|
存储 弹性计算 Serverless
什么是阿里云FPGA云服务器?FPGA云服务器产品优势及应用场景介绍
FPGA云服务器是阿里云提供的实例规格,融合现场可编程门阵列的低延迟硬件加速与弹性资源。FaaS平台简化了FPGA开发,提供统一硬件、开发环境和丰富的IP生态。特性包括硬件虚拟化、联合仿真和动态互联配置。产品计费与ECS一致,支持多种计费模式。优势在于分钟级交付、高性能加速、经济性价比和设计复用。应用广泛,如视频转码、人工智能、基因测序等。FPGA云服务器通过FPGA镜像、OSS服务等工具进行管理。
什么是阿里云FPGA云服务器?FPGA云服务器产品优势及应用场景介绍
|
网络协议 安全 关系型数据库
Mysql5.7.41_windows64位安装_卸载
mysql5.7 windows安装
457 1
|
设计模式 前端开发 Java
mvc模式详解
mvc模式详解