杨辉三角的不同实现方法
2015-08-01 21:10
190 查看
/*杨辉三角形是形如 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 的三角形,其实质是二项式(a+b)的n次方展开后各项的系数排成的三角形, 它的特点是左右两边全是1,从第二行起,中间的每一个数是上一行里相邻两个数之和。 这个题目常用于程序设计的练习。 下面给出六种不同的解法。 解法一*/ #include <stdio.h> main() { int i,j,n=0,a[17][17]={0}; while(n<1 || n>16) { printf("请输入杨辉三角形的行数:"); scanf("%d",&n); } for(i=0;i<n;i++) a[i][0]=1; /*第一列全置为一*/ for(i=1;i<n;i++) for(j=1;j<=i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j];/*每个数是上面两数之和*/ for(i=0;i<n;i++) /*输出杨辉三角*/ { for(j=0;j<=i;j++) printf("%5d",a[i][j]); printf("\n"); } } //点评:解法一是一般最容易想到的解法,各部分功能独立,程序浅显易懂。 //解法二 /*#include <stdio.h> main() { int i,j,n=0,a[17][17]={1}; while(n<1 || n>16) { printf("请输入杨辉三角形的行数:"); scanf("%d",&n); } for(i=1;i<n;i++) { a[i][0]=1; /*第一列全置为一*/ for(j=1;j<=i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; /*每个数是上面两数之和*/ } for(i=0;i<n;i++) /*输出杨辉三角*/ { for(j=0;j<=i;j++) printf("%5d",a[i][j]); printf("\n"); } } //点评:解窢二是在解法一的基础上,把第一列置为1的命令移到下面的双重循环中,减少了一个循环。注意初始化数组的变化。 //解法三 #include <stdio.h> main() { int i,j,n=0,a[17][17]={0,1}; while(n<1 || n>16) { printf("请输入杨辉三角形的行数:"); scanf("%d",&n); } for(i=1;i<=n;i++) for(j=1;j<=i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; /*每个数是上面两数之和*/ for(i=1;i<=n;i++) /*输出杨辉三角*/ { for(j=1;j<=i;j++) printf("%5d",a[i][j]); printf("\n"); } } //点评:解法三是在解法一、二的基础上,把第一列置为1的命令去掉了,注意初始化数组的变化。 //解法四 #include <stdio.h> main() { int i,j,n=0,a[17][17]={0,1}; while(n<1 || n>16) { printf("请输入杨辉三角形的行数:"); scanf("%d",&n); } for(i=1;i<=n;i++) { for(j=1;j<=i;j++) { a[i][j]=a[i-1][j-1]+a[i-1][j]; /*每个数是上面两数之和*/ printf("%5d",a[i][j]); /*输出杨辉三角*/ } printf("\n"); } } //点评:解法四是在解法三的基础上,把计算和打印合并在一个双重循环中。 //解法五 #include <stdio.h> main() { int i,j,n=0,a[17]={1},b[17]; while(n<1 || n>16) { printf("请输入杨辉三角形的行数:"); scanf("%d",&n); } for(i=0;i<n;i++) { b[0]=a[0]; for(j=1;j<=i;j++) b[j]=a[j-1]+a[j]; /*每个数是上面两数之和*/ for(j=0;j<=i;j++) /*输出杨辉三角*/ { a[j]=b[j]; /*把算得的新行赋给a,用于打印和下一次计算*/ printf("%5d",a[j]); } printf("\n"); } } //点评:解法一到解法四都用了二维数组,占用的空间较多。而解法五只使用了两个一维数组。 //解法六 #include <stdio.h> main() { int i,j,n=0,a[17]={0,1},l,r; while(n<1 || n>16) { printf("请输入杨辉三角形的行数:"); scanf("%d",&n); } for(i=1;i<=n;i++) { l=0; for(j=1;j<=i;j++) { r=a[j]; a[j]=l+r; /*每个数是上面两数之和*/ l=r; printf("%5d",a[j]); /*输出杨辉三角*/ } printf("\n"); } } //点评:解法六只使用了一个一维数组和两个临时变量。
相关文章推荐
- java的api操作HDFS实现递归打印目录并实现在Linux下的显示效果
- C/C++字符串操作函数总结
- [c]hdoj1023 卡特兰数
- IIS8/IIS7/IIS6 出现ADODB.Connection 错误 '800a0e7a'的解决办法
- Length of Last Word
- 无向图的欧拉回路和欧拉通路
- 本本win10的脾气,无法共享wifi
- 内部类、常用类、正则表达式、File类(2015/8/01)
- 线程---创建,终止
- 100.Same Tree
- 【快速幂运算与矩阵快速幂专题】
- NYOJ 860 又见01背包
- HDU 1412-{A} + {B}
- 常用对话框
- Hibernate常见配置详细解释
- JSTL标签的使用示例
- mysql中的mysql_pconnect和mysql_connect的区别
- 程序猿常用素材网站—程序猿必备
- k2pdfopt详细教程-让kindle看遍所有pdf
- 循环语句和if语句等