当前位置: 首页 > news >正文

C语言:实现杨辉三角的种方法

一.杨辉三角的数学原理

  • 杨辉三角的定义:二项式系数在三角形中的几何排列

二.基础二维数组法


#include <stdio.h>
#define N 10void printPascalTriangle(int n) {int triangle[N][N];// 初始化第一列和对角线为1for (int i = 0; i < n; i++) {triangle[i][0] = 1;triangle[i][i] = 1;}// 计算中间元素for (int i = 2; i < n; i++) {for (int j = 1; j < i; j++) {triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];}}// 打印三角形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("%d ", triangle[i][j]);}printf("\n");}
}int main() {printPascalTriangle(10);return 0;
}​
  • 使用二维数组存储每个元素

  • 第一列和对角线元素都为1

  • 其他元素等于上一行同列和前一列元素之和

  • 简单直观,但空间复杂度为O(n²)

三.优化空间的一维数组法 

#include <stdio.h>
#define N 10void printPascalTriangle(int n) {int row[N];for (int i = 0; i < n; i++) {// 从后往前计算避免覆盖row[i] = 1;for (int j = i - 1; j > 0; j--) {row[j] = row[j] + row[j-1];}// 打印前导空格for (int k = 0; k < n - i - 1; k++) {printf(" ");}// 打印当前行for (int j = 0; j <= i; j++) {printf("%d ", row[j]);}printf("\n");}
}int main() {printPascalTriangle(10);return 0;
}
  • 只使用一维数组,空间复杂度降为O(n)

  • 从后往前计算避免覆盖前一次的结果

  • 更高效的内存使用,但逻辑稍复杂

四.递归实现

#include <stdio.h>int pascalValue(int row, int col) {if (col == 0 || col == row) {return 1;}return pascalValue(row - 1, col - 1) + pascalValue(row - 1, col);
}void printPascalTriangle(int 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("%d ", pascalValue(i, j));}printf("\n");}
}int main() {printPascalTriangle(10);return 0;
}
  • 使用递归计算每个位置的值

  • 代码简洁,符合数学定义

  • 效率较低,有大量重复计算

  • 时间复杂度为O(2ⁿ)

五.组合数公式法

#include <stdio.h>int factorial(int n) {if (n == 0) return 1;return n * factorial(n - 1);
}int combination(int n, int k) {return factorial(n) / (factorial(k) * factorial(n - k));
}void printPascalTriangle(int 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("%d ", combination(i, j));}printf("\n");}
}int main() {printPascalTriangle(10);return 0;
}
  • 利用组合数公式C(n,k) = n!/(k!(n-k)!)

  • 数学意义明确

  • 计算阶乘容易溢出,效率不高

  • 适合理论理解,实际应用有限

 六.动态规划优化

#include <stdio.h>
#define N 10void printPascalTriangle(int n) {int triangle[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++) {// 第一列和对角线为1if (j == 0 || j == i) {triangle[i][j] = 1;} else {triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];}printf("%d ", triangle[i][j]);}printf("\n");}
}int main() {printPascalTriangle(10);return 0;
}
  • 结合了方法一和方法二的优点

  • 边计算边打印,减少内存访问

  • 代码结构更紧凑

  • 仍然使用二维数组,但计算和输出合并

七.使用指针的方法 

#include <stdio.h>
#include <stdlib.h>void printPascalTriangle(int n) {int **triangle = (int **)malloc(n * sizeof(int *));for (int i = 0; i < n; i++) {triangle[i] = (int *)malloc((i + 1) * sizeof(int));triangle[i][0] = 1;triangle[i][i] = 1;for (int j = 1; j < i; j++) {triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];}// 打印前导空格for (int k = 0; k < n - i - 1; k++) {printf(" ");}for (int j = 0; j <= i; j++) {printf("%d ", triangle[i][j]);}printf("\n");}// 释放内存for (int i = 0; i < n; i++) {free(triangle[i]);}free(triangle);
}int main() {printPascalTriangle(10);return 0;
}
  • 使用指针动态分配内存

  • 可以处理更大的n值(受内存限制)

  • 需要手动管理内存

  • 更接近实际工程应用

http://www.lryc.cn/news/572799.html

相关文章:

  • Linux命令合集
  • LVS负载均衡群集:Nginx+Tomcat负载均衡群集
  • 云宏信息轻量云平台:解锁金融业IT架构优化之路
  • Postman接口测试完整版
  • 《P2161 [SHOI2009] 会场预约》
  • 将无序json数据转换为excel表格形式
  • 【FineDance】vis.py 硬编码路径的修复
  • 服务器手动安装并编译R环境库包:PROJ→RGDAL
  • RenderDoc抓webgl 1
  • 科技赋能民生:中建海龙为民生改善注入新动力
  • 【CS创世SD NAND征文】STM32户外无线终端管理设备的数据存储方案
  • Logback 在java中的使用
  • 力扣-169.多数元素
  • [muduo] docs | 配置教程 | EventLoop | Thread
  • python实战项目76:51job数据采集与分析
  • 14.9 AI教学系统测试全攻略:模块化调试与5大模块实战指南
  • 服务网格安全(Istio):用零信任架构重构微服务通信安全
  • 【Linux驱动开发 ---- 4.2_平台设备(Platform Devices)概述】
  • 基于深度学习的智能视频行为识别系统:技术与实践
  • 解决Windows10没有Microsoft store微软商店
  • C#学习日记
  • 局域网文件共享及检索系统
  • 在小程序中实现上下左右拖动表格
  • js调用微信支付 第二步 获取access_token ——仙盟创梦IDE
  • 多线程八股
  • Docker Swarm 与 Docker Compose 对比解析
  • 汽车整车厂如何用数字孪生系统打造“透明车间”
  • python高校工作室管理系统
  • 晨控CK-FR06与西门子PLC配置Modbus TCP通讯连接操作手册
  • Cmake入门及CMakeLists.txt 语法介绍