C语言实现杨辉三角的两种常用方法
本文介绍如何使用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(),直接在打印时计算当前值。
注意事项与潜在风险
- 数据类型选择:阶乘增长极快。若使用
int类型,当行数超过约13行后极易发生整型溢出。建议至少使用float或double类型,但这仅能保证不报错,无法保证精度(见下文缺点分析)。 - 浮点数显示:由于使用了浮点运算,最终打印时需使用格式符
%4.0f去除小数部分,否则会将类似 “1.000000” 的输出显示为整数形态。 - 性能损耗:每次打印一个数都要重新计算一次阶乘,相比数组法的 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语言算法基础资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









