C语言实现杨辉三角的两种常用方法

拾光
拾光
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍如何使用C语言在控制台打印杨辉三角,提供基于二维数组迭代和组合数公式计算的两种完整代码方案,详细解析其逻辑结构、排版技巧及注意事项。

杨辉三角的基本特性

杨辉三角是中国古代数学的一项重要成就,其几何排列规律清晰且实用。在计算机编程中,实现它主要依赖两个核心数学特性:

  • 递推关系:三角形腰部的数字均为1;其余位置的数值等于其正上方与左上方两个数值之和。
  • 组合数性质:第 n 行(从0开始计数)的第 k 个元素对应二项式展开的系数 C(n, k),即从 n 个不同元素中取 k 个的组合数。

方法一:使用二维数组模拟递推

此方法最符合杨辉三角的几何构造逻辑。通过定义一个足够大的二维数组来存储每一行的值,利用循环逐个填入数据。这种方法逻辑直观,且便于后续对中间数据进行修改或扩展。

第1步:定义数组并获取用户输入

首先定义常量上限以限制内存占用,并通过 while 循环确保输入的行数在合理范围内(例如 1 到 13 行),防止越界溢出。

第2步:初始化边界值

遍历行数,将每一行的第一个元素 a[i][1] 和最后一个元素 a[i][i] 均赋值为 1。这是构建三角形的基础框架。

第3步:填充中间元素

从第3行开始(索引为3,假设首行为1),对于非边界的列 j,执行递推公式:a[i][j] = a[i-1][j-1] + a[i-1][j]。这一步是算法的核心,确保了每个数值都是上一行相邻两数之和。

第4步:格式化打印与排版

打印前需添加空格占位(如双空格 " ")以实现居中对齐效果。内层循环控制数值宽度(使用 %6d 保持整齐),外层循环负责换行。

#include <stdio.h>
#define N 14
void main()
{
  int i, j, k, n=0, a[N][N]; /*定义二维数组a[14][14]*/
  while(n<=0||n>=13){ /*控制打印的行数不要太大,过大会造成显示不规范*/
    printf("请输入要打印的行数:");
    scanf("%d",&n);
  }
  printf("%d行杨辉三角如下:\n",n);
  for(i=1;i<=n;i++)
    a[i][1] = a[i][i] = 1; /*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/
  for(i=3;i<=n;i++)
    for(j=2;j<=i-1;j++)
      a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除两边的数外都等于上两顶数之和*/ 
  for(i=1;i<=n;i++){
    for(k=1;k<=n-i;k++)
      printf("  "); /*这一行主要是在输出数之前打上空格占位,让输出的数更美观*/
    for(j=1;j<=i;j++) /*j<=i的原因是不输出其它的数,只输出我们想要的数*/
      printf("%6d",a[i][j]);
    
    printf("\n"); /*当一行输出完以后换行继续下一行的输出*/
  }
  printf("\n");
}

预期输出结果(以10行为例):

                1
               1   1
             1   2   1
            1   3   3   1
          1   4   6   4   1
         1   5  10  10   5   1
       1   6  15  20  15   6   1
      1   7  21  35  35  21   7   1
    1   8  28  56  70  56  28   8   1
   1   9  36  84  126  126  84  36   9   1

方法二:利用组合数公式直接计算

此方法基于高中数学知识,杨辉三角的第 n 行第 k 个数等于组合数 C(n-1, k-1)。代码中定义了求阶乘函数 J() 和求组合数函数 C(),直接在打印时计算当前值。

注意事项与潜在风险

  1. 数据类型选择:阶乘增长极快。若使用 int 类型,当行数超过约13行后极易发生整型溢出。建议至少使用 float 或 double 类型,但这仅能保证不报错,无法保证精度(见下文缺点分析)。
  2. 浮点数显示:由于使用了浮点运算,最终打印时需使用格式符 %4.0f 去除小数部分,否则会将类似 “1.000000” 的输出显示为整数形态。
  3. 性能损耗:每次打印一个数都要重新计算一次阶乘,相比数组法的 O(1) 查表,时间复杂度较高。
#include <stdio.h>
/* 
 * 定义阶乘,在这里可能会想。为什么要用float,当我试第一次的时候,
 * 如果用int的话,那么在打印行数多了以后就会出错。
 * 这是因为阶乘的数比较大,如果用int就不够用了。下同
 */
float J(int i){
  int j;
  float k=1;
  for(j=1;j<=i;j++)
    k=k*j;
  return(k);
}
float C(int i,int j){ /*定义组合数*/
  float k;
  k=J(j)/(J(i)*J(j-i));
  return(k);
}
void main(){
  int i=0,j,k,n; /*打印杨辉三角*/ 
  while(i<=0||i>16){
    printf("请输入要打印的行数:");
    scanf("%d",&i);
  }
  printf("%d行杨辉三角如下:\n",i);
  for(j=0;j<i;j++){
    for(k=1;k<=(i-j);k++)
      printf(" ");
    for(n=0;n<=j;n++)
      printf("%4.0f",C(n,j));
    printf("\n");
  }
  printf("\n\n");
}

虽然代码能够成功打印出三角形图案,但由于浮点数精度限制和阶乘计算的性能问题,**在工程实践中不建议将此作为生成大型杨辉三角的首选方案**。

总结

对于学习C语言初学者而言,第一种二维数组法是理解数据结构与递推逻辑的最佳实践,代码健壮且易于修改。第二种方法则展示了如何利用数学公式简化编程逻辑,但需注意数据溢出与精度问题。以上就是C语言实现杨辉三角的详细内容,更多关于C语言算法基础资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表