以下兩題是朋友的段考題, 朋友來問我我就幫他解了一下.
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
print1
j>i
printj+(i-1)
j<i
printj+(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;
else
num = num * (i-j+1)/(j);
printf("%3d", num);
}
printf("\n");
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。