iooops 发表于 2016-4-1 13:20:05

【一天一条C语言算法3】巴斯卡三角形

本帖最后由 iooops 于 2016-4-1 21:30 编辑

【说明】
想办法生成下面这个图形:



细心的胖友一定已经发现了一个规律,那就是!下面的数字是上面两个数字之和!
http://jishus.org/wp-content/uploads/2011/07/210px-PascalTriangleAnimated2.gif








然而其实这一点对于解题而言好像并没有什么卵用 - -










好吧其实楼主绞尽了脑汁都没能想出解决的办法 - -

好在有大神知道该怎么办- -


【解法】
http://jishus.org/wp-content/uploads/2011/07/2011-07-24_080544.jpg

没错就是它!
细心的胖友一定又发现了上面的三角形和阶乘公式的关系吧!



阶乘公式又可以写成下面这样:


那么既然如此,那我们就能基于这个公式来一行行输出我们想要的数字了!
一行行的数字的实现,那么是使用循环,从上而下打。
我们知道,每一行的第一个数字一定是1,然后当行的行数一定是n,然后根据公式,我们来把n和r分别代入,依次求解后面的数字,那么这就可以用循环的方式来实现啦。

那用嵌套的循环就能实现这个巴斯卡三角形啦~~


C语言实现代码如下:
#include <stdio.h>
#define HEIGHT 12

int combi(int n, int m){
    int p = 1;
    int i;
    for(i = 1; i <= m; i++) {
      p = p * (n - i + 1) / i;
    }
    return p;
}

int main() {
    int n;
    for(n = 0; n < HEIGHT; n++) {
      char format;            
      sprintf(format, "%%%ds", (HEIGHT - n) * 3);
      printf(format, "");
      int m;
      for(m = 0; m <= n; m++) {
            printf("%6d", combi(n, m));
      }
      printf("\n");
    }
    return 0;
}
运行结果如下:





有没有觉得很神奇呢!
楼主为了搞懂这个实现方式死了不少的脑细胞呢!






另:鉴于连载算法耗的楼主的脑细胞实在有点多,楼主打算每两到三天更新一篇。
推荐一个在线编译器:http://codepad.org
楼主使用下来唯一觉得有点遗憾的就是一碰到需要输入的部分就无法正常工作了。


参考:
https://jishus.org/?p=598
http://openhome.cc/Gossip/AlgorithmGossip/PascalTriangle.htm


dsweiliang 发表于 2016-4-1 17:46:49

看到数学就头痛

iooops 发表于 2016-4-1 21:32:51

dsweiliang 发表于 2016-4-1 17:46
看到数学就头痛

啊3D打印的工具绝对绝对是应用数学的集大成之作啊!{:5_141:}虽然小白并不能了解它是怎么实现的 - -
页: [1]
查看完整版本: 【一天一条C语言算法3】巴斯卡三角形