巴斯卡三角形

Problem

印出巴斯卡三角形, 使用者輸入n則輸出n層巴斯卡三角形, 不使用array.
假設使用者輸入為5, 則輸出:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1  

Solution

這題我還真的想不出來, 但是網路上有神人解出來了, 在此
我理解了之後來解釋一樣, 我先將i當作row, j當作column且都從0開始, 很明顯地我們知道:j==0i==j的時候會輸出1, 難的是其他部分.

我們來討論其他部分的情況, 如果數學好一點的會發現在row=i column=j會等於iCj, 難的部分來了, 因為巴斯卡三角形通常是從上一層加下來的, 但是你不能用陣列記住上一層的值, 但是其實記住每一個row的第一個值, 然後開始向後推出來.

sol1

假設所在的位址為row=i column=j 則這個數為iCj, 那你右邊的那一個數字其實就是(i+1)Cj, 那這兩個數字的比值其實就是 (j+1)Cj / iCj等於(i-j)/j+1, 既然推出來了你可以用作左邊的數字1一直去乘以這個值就行了, 這個方法有個細節, 先印出自己的值, 並且順便推出下一個值, 所以你印的值都是上一次算出來的.

for(i = 0 ; i < n ; i++){
    num = 1;
    for(j = 0 ; j <= i ; j++){
        printf("%3d",num);
        num = num * (i-j)/(j+1);
    }
    printf("\n");   
}

sol2

剛剛探討的是跟右邊數字的關係, 其實也可以探討跟數字左邊的關係, 假設所在的位址為row=i column=j 則這個數為iCj, 左邊的數字為iC(j-1), 所以兩邊的比值為(i-j+1)/j, 這方法的細節就是, 先從上一個值算出自己的值, 在印出自己的值, 所以你自己得值是從這次算出來的.

for(i = 0 ; i < n ; i++){
    for(j = 0 ; j <= i ; j++){
        if(i==j || j==0)
             num = 1;
        else
            num = num * (i-j+1)/(j);
             
            printf("%3d", num);
    
    }
    printf("\n");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,188评论 3 49
  • 不知不觉,坚持日更已经半个月了。今天,我不写故事,写写自己通过这半个月来的日更,收获了什么,算是对我这一阶段的写作...
    野蛮生长Vickyee阅读 415评论 14 5
  • 六年退休生活的感悟。 多少年的风风雨雨,无数次的憧憬浪漫,无数次的灿烂笑脸,蓦然回首,不知不觉已退休...
    无忧无虑61阅读 733评论 4 3
  • Against a stretch of magnificent hill parks(sits) a class...
    llclare阅读 206评论 0 0
  • 身后的高楼迷离 霓虹灯恍惚 如梦 像酒鬼吐出的烟雾 多少疲惫的眼睛 还硬撑着一盏微光 滂沱大雨后 谁会在乎那地上...
    萧竺阅读 145评论 0 2