算法思考-------杨辉三角(c语言)

《算法思考-------杨辉三角(c语言)》

代码实现

#include<stdio.h> #define N 12 long combi(int n,int r) { int i; long p = 1; for(i=1;i<=r;i++) { p = p*(n-i+1)/i; } return p; } void paint() { int n,r; for(n=0;n<=N;n++) { for(r=0;r<=n;r++) { int i; if(0==r) { for(i=0;i<=(N-n);i++) printf(" ");//两个空格 } else { printf(" ");//一个空格 } printf("%3d",combi(n,r)); } printf("\n"); } } int main() { paint(); return 0; } 

《算法思考-------杨辉三角(c语言)》

 分析:为了好理解,将代码中的空格换为”*”
《算法思考-------杨辉三角(c语言)》
combi()函数是用来求每一行输出的值的,首先每行通过一个循环输出最左边
的”*”,然后输出combi()返回的一个数,再输出else语句中的一个”*”,最后换
行,继续循环。可以看到如果不要左边的”*”,每一行数字的个数总比”*”多一,由代码解释就是《算法思考-------杨辉三角(c语言)》
可以看到,在这个循环中,每次循环都将r从0开始复制,然后r++,所以每次
循环都会在第一次进入if(0==r)的执行体执行,所以第一次不会进入else输出
一个”*”,而printf(“%3d”,combi(n,r))每次都会执行,并输出一个数字,这样在
屏幕输出的数就比”*”多一个了。另外之所以控制输出位宽为”%3d”,是因为这
里N为12,共输出13行,这些数中最大的数为924,所以没有数会超过3位

所以这样做是为了对齐,若改为”%2d”,结果为
《算法思考-------杨辉三角(c语言)》
可以看到并没有对齐
而对于函数combi(),大家是否记得排序组合问题,A(4,3)=4*3*2,
A(8,4)=8*7*6*5,    C(5,3)=(5!)/(3!*2!),     C(8,6)=(8!)/(6!*2!)
而这里正是要用到C(n,r),这就是combi(n,r)的根本算法

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/zhouzixin053/article/details/21485107
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞