如下兩題是朋友的段考題, 朋友來問我我就幫他解了一下.3d
假設使用者輸入3
, 電腦會印出:code
123 312 231
現在使用者輸入5
, 則電腦會印出這些東西:io
12345 51234 45123 34512 23451
然後再推廣到n
方法
一開始第一個想法必定是用陣列就輕鬆解決, 可是朋友說老師還沒教, 意思就是不要你使用陣列解.co
我先將i
當做row
, j
當做column
且都從1
開始, 我把把他分红右上角(j>i
), 對角線(j==i
), 左下角的部分(j<i
), 其實想想你會發現規律, 假設我已使用者輸入n
, 則我會發現有:printf
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"); }
印出巴斯卡三角形, 使用者輸入n
則輸出n
層巴斯卡三角形, 跟剛剛一樣不用陣列.
假設使用者輸入為5
, 則輸出:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
這題我還真的想不出來, 可是網路上有神人解出來了, 在此
我理解了之後來解釋一樣, 我先將i
當做row
, j
當做column
且都從0
開始, 很明顯地我們知道:j==0
和i==j
的時候會輸出1
, 難的是其余部分.
我們來討論其余部分的情況, 若是數學好一點的會發現在row=i column=j
會等於iCj
, 難的部分來了, 因為巴斯卡三角形一般是從上一層加下來的, 可是你不能用陣列記住上一層的值, 可是其實記住每一個row的第一個值, 然後開始向後推出來.
假設所在的位址為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"); }
剛剛探討的是跟右邊數字的關係, 其實也能够探討跟數字左邊的關係, 假設所在的位址為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"); }