美文网首页
Pascal triangle without using ar

Pascal triangle without using ar

作者: iamkai | 来源:发表于2016-11-17 19:49 被阅读0次

    Problem

    印出巴斯卡三角形, 使用者輸入n則輸出n層巴斯卡三角形, 跟剛剛一樣不用陣列.
    假設使用者輸入為5, 則輸出:

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

    Analysis

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

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

    Solution1

    假設所在的位址為row=i column=j 則這個數為iCj, 那你右邊的那一個數字其實就是i+1Cj, 那這兩個數字的比值其實就是 j+1Cj / 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");   
    }
    
    

    Solution2

    剛剛探討的是跟右邊數字的關係, 其實也可以探討跟數字左邊的關係, 假設所在的位址為row=i column=j 則這個數為iCj, 左邊的數字為iCj-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");
    }
    

    相关文章

      网友评论

          本文标题:Pascal triangle without using ar

          本文链接:https://www.haomeiwen.com/subject/qmxjpttx.html