编写程序:在屏幕上打印杨辉三角

本文介绍了一个使用C语言编写的简单程序,该程序能够生成并打印杨辉三角。通过双重循环结构,程序实现了杨辉三角各层元素的计算与显示。

编写程序:在屏幕上打印杨辉三角


程序代码如下:



#include <stdio.h>
# define LINE 10
int main()
{
    int arr[LINE][LINE] = {0};
    int i = 0;
    int j = 0;
    for (i = 0; i < LINE; i++)
    {
        arr[i][0] = 1;
        arr[i][i] = 1;
    }
    for (i = 2; i < LINE; i++)
    {
        for (j = 1; j < i; j++)
        {
            arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
        }
    }
    for (i = 0; i < LINE; i++)
    {
        for (j = 0; j < (2 * LINE - 2 * i); j++)
        {
            printf(" ");
        }
        for (j = 0; j <= i; j++)
        {
            printf("%4d",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
} 

程序运行结果如下:


这里写图片描述

<think> 我们要求打印杨辉三角,行数n<=10,因此我们可以使用二维数组来存储杨辉三角的每个值。根据题目要求,主函数负责输入行数,子函数负责计算并输出杨辉三角。 注意:杨辉三角的性质: 1. 第0行(我们通常从第0行开始)只有1个数字1。 2. 每一行的第一个数和最后一个数都是1。 3. 从第三行(即第2行,0-indexed)开始,中间的数等于上一行的同一列和上一行的前一列的两个数之和。 由于题目要求n<=10,我们可以定义一个足够大的二维数组(比如10x10)来存储。 子函数设计:void printYangHuiTriangle(int n) 功能:计算并打印n行杨辉三角打印格式要求:为了美观,我们通常将杨辉三角打印成等腰三角形,在每行前面添加适当数量的空格。 具体步骤: 1. 初始化二维数组,将第一列和对角线上的元素置为1(即每一行的第一个和最后一个)。 2. 计算中间元素:arr[i][j] = arr[i-1][j-1] + arr[i-1][j]。 3. 打印:对于第i行,先打印一定数量的空格(例如n-i-1个空格,使得每行的第一个数字在屏幕居中),然后打印该行的每个数字,数字之间用空格隔开。 注意:数字的宽度和空格的个数需要适当调整,以保证对齐。由于n<=10,最大数字是C(10,5)=252(三位数),所以我们可以用固定宽度(比如每个数字占4位)来打印。 主函数中,输入行数n,然后调用子函数。 参考引用[2]和[3]中的方法,但注意题目要求子函数负责计算和输出。 我们这里不使用递归(引用[5]的方法),因为递归效率低且n很小,我们使用二维数组迭代。 代码实现如下: </think># C语言实现杨辉三角打印 ## 完整代码实现 ```c #include <stdio.h> #define MAX_ROWS 10 // 最大行数限制 // 打印杨辉三角的子函数 void printYangHuiTriangle(int n) { if (n <= 0 || n > MAX_ROWS) { printf("行数必须在1到%d之间!\n", MAX_ROWS); return; } // 创建二维数组存储杨辉三角 int triangle[MAX_ROWS][MAX_ROWS]; // 初始化杨辉三角 for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { // 每行首尾元素为1 if (j == 0 || j == i) { triangle[i][j] = 1; } // 中间元素为上一行相邻元素之和 else { triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]; } } } // 打印杨辉三角 printf("\n%d行杨辉三角:\n", n); for (int i = 0; i < n; i++) { // 打印前导空格形成等腰三角形 for (int k = 0; k < n - i - 1; k++) { printf(" "); // 两个空格使对齐更好看 } // 打印当前行所有元素 for (int j = 0; j <= i; j++) { printf("%-4d", triangle[i][j]); // 左对齐,宽度为4 } printf("\n"); // 换行 } } int main() { int n; printf("请输入杨辉三角的行数(1-%d):", MAX_ROWS); scanf("%d", &n); // 调用子函数打印杨辉三角 printYangHuiTriangle(n); return 0; } ``` ## 算法解析 ### 杨辉三角的数学性质 杨辉三角(帕斯卡三角)具有以下数学性质: 1. 每一行的第一个数和最后一个数都是1 2. 从第三行开始,每个数是它正上方和左上方两个数之和 3. 第$n$行第$k$个数是二项式系数$C(n-1,k-1)$ 4. 第$n$行有$n$个数 ### 代码实现原理 1. **初始化阶段**: - 创建二维数组存储杨辉三角的值 - 初始化每行的首尾元素为1 2. **计算阶段**: - 使用递推关系计算中间元素值: $$ \text{triangle}[i][j] = \text{triangle}[i-1][j-1] + \text{triangle}[i-1][j] $$ - 时间复杂度:$O(n^2)$ - 空间复杂度:$O(n^2)$ 3. **打印阶段**: - 使用前导空格实现等腰三角形效果 - 格式化输出保证数字对齐 ## 运行示例 ``` 请输入杨辉三角的行数(1-10):5 5行杨辉三角: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 ``` ## 杨辉三角的数学用 1. **二项式展开**: 杨辉三角的第$n$行对$(a+b)^{n-1}$展开式的系数: $$(a+b)^4 = a^4 + 4a^3b + 6a^2b^2 + 4ab^3 + b^4$$ 2. **组合数学**: 第$n$行第$k$个数等于组合数$C(n-1,k-1)$ 3. **概率计算**: 在二项分布概率计算中有重要用 4. **斐波那契数列**: 斐波那契数列可以通过杨辉三角的斜线和得到 ## 相关问题 ### 1. 如何优化杨辉三角的空间复杂度? <details> <summary>查看答案</summary> 可以使用一维数组代替二维数组进行优化: 1. 只需要存储上一行的数据 2. 从后向前计算当前行 3. 空间复杂度降低到$O(n)$ 优化代码示例: ```c void printYangHuiTriangleOptimized(int n) { int row[MAX_ROWS] = {0}; row[0] = 1; // 第一行 for (int i = 0; i < n; i++) { // 打印前导空格 for (int k = 0; k < n - i - 1; k++) printf(" "); // 计算并打印当前行 for (int j = i; j > 0; j--) row[j] = row[j] + row[j-1]; for (int j = 0; j <= i; j++) printf("%-4d", row[j]); printf("\n"); } } ``` </details> ### 2. 杨辉三角与二项式定理的关系是什么? <details> <summary>查看答案</summary> 杨辉三角直接展示二项式展开的系数: $$(a+b)^n = \sum_{k=0}^{n} C(n,k) a^{n-k}b^k$$ 其中$C(n,k)$对杨辉三角第$n+1$行第$k+1$个数字。例如: - $(a+b)^3$的系数1,3,3,1对第4行 - $(a+b)^4$的系数1,4,6,4,1对第5行 这种关系最早由中国数学家杨辉在13世纪发现,后由帕斯卡在17世纪独立重新发现[^1]。 </details> ### 3. 如何计算杨辉三角中任意位置的数值? <details> <summary>查看答案</summary> 可以使用递归或组合数公式计算: **递归方法**: ```c int yanghuiValue(int row, int col) { if (col == 0 || col == row) return 1; else return yanghuiValue(row-1, col-1) + yanghuiValue(row-1, col); } ``` **组合数公式**: $$C(n,k) = \frac{n!}{k!(n-k)!}$$ 代码实现: ```c int combination(int n, int k) { if (k == 0 || k == n) return 1; long result = 1; k = (k < n - k) ? k : n - k; // 优化计算 for (int i = 1; i <= k; i++) { result = result * (n - i + 1) / i; } return (int)result; } ``` </details>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值