日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

巴斯卡三角形 and 數字位移

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 巴斯卡三角形 and 數字位移 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下兩題是朋友的段考題, 朋友來問我我就幫他解了一下.

Problem1

假設使用者輸入3, 電腦會印出:

123 312 231

?
現在使用者輸入5, 則電腦會印出這些東西:

12345 51234 45123 34512 23451

然後再推廣到n

Solution

一開始第一個想法一定是用陣列就輕鬆解決, 但是朋友說老師還沒教, 意思就是不要你使用陣列解.

我先將i當作row, j當作column且都從1開始, 我把把他分成右上角(j>i), 對角線(j==i), 左下角的部分(j<i), 其實想一想你會發現規律, 假設我已使用者輸入n, 則我會發現有:

  • j==i print 1

  • j>i print j+(i-1)

  • j<i print j+(n-i+1)

  • 推出來之後程式就相當簡單了:

    for(i = 1 ; i <= n ; i++){for(j = 1 ; j <= n ; j++){if(j == i)printf("1");else if(j > i)printf("%d", j-i+1);else if(j < i)printf("%d", j+n-i+1);}printf("\n"); }

    Problem2

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

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

    Solution

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

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

    解法1

    假設所在的位址為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"); }

    解法2

    剛剛探討的是跟右邊數字的關係, 其實也可以探討跟數字左邊的關係, 假設所在的位址為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;elsenum = num * (i-j+1)/(j);printf("%3d", num);}printf("\n"); }

    總結

    以上是生活随笔為你收集整理的巴斯卡三角形 and 數字位移的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。