SOGO論壇
  登入   註冊   找回密碼
查看: 1691|回覆: 2
列印 上一主題 下一主題

[程式設計] C++註解 [複製連結]

Rank: 2

狀態︰ 離線
跳轉到指定樓層
1
發表於 2010-11-24 19:14:10 |只看該作者 |倒序瀏覽
#include <iostream>

using namespace std;

int Bin(int n, int k) {
if (n==k||k==0) {
return 1;
} else {
return Bin(n-1, k)+Bin(n-1, k-1);
}
}


int main()
{
int N, K, n,r,i;
cout << "請輸入N:";
cin >> N;
cout << "請輸入K:";
cin >> K;

// 二項式係數
cout << "C(N,K)=" << Bin(N,K);

// 巴斯卡三角形

for (n=0;n<=N;n++) {
for (r=0;r<=n;r++) {
long nCr = 1;
for(i=1;i<=r;i++) {
nCr = nCr * (n-i+1)/i;

}
cout << nCr;
}
cout << "\n";
}

system ("pause");
return 0 ;
}


有些地方不太清楚,有大大可以幫我註解一下嗎?感恩
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

Rank: 2

狀態︰ 離線
2
發表於 2011-3-9 16:49:10 |只看該作者
先看選取法:
int Bin(int n, int k) {
if (n==k||k==0) {
return 1;
} else {
return Bin(n-1, k)+Bin(n-1, k-1);
}
}

表示: C(N, K) , 即 N 個相異物選取 K 個,有幾個選法,
由於 n 個相異物選取 n 個物件只有一種選法,(即全選)
且 n 個相異物選取 0 個物件也只有一種選法,(即全不選)
所以遞迴終止條件為:
if (n==k||k==0) {
return 1;
}
否則 C(N, K) = C(N-1, K) + C(N-1, K-1):
else {
return Bin(n-1, k)+Bin(n-1, k-1);
}
註: 考慮某一物件 a,則 C(N, K) 有兩種選法:
即 a 物件必不選的取法 + a 物件必選的取法
即 a 物件必不選的取法相當於剩下的 N-1 件相異物再挑選 K 件的取法有 C(N-1, K)
   a 物件必選的取法相當於剩下的 N-1 件相異物再挑選 K-1 件的取法有 C(N-1, K)
所以 C(N, K) = C(N-1, K) + C(N-1, K-1)
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 2 感謝您熱心幫助會員解決問題,論壇需要您 ...

總評分: 威望 + 2   查看全部評分

Rank: 2

狀態︰ 離線
3
發表於 2011-3-9 17:07:09 |只看該作者
巴斯卡三角形:
1
1,1
1,2,1
1,3,3,1
1,4,6,4,1

相當於:
C(0,0)
C(1,0), C(1,1)
C(2,0), C(2,1), C(2,2)
C(3,0), C(3,1), C(3,2), C(3,3)
...................

又 C(n,k)
= n! / (k!*(n-k)!)
= n*(n-1)*(n-2)*....*(k+1) / (n-k)!
= n*(n-1)*(n-2)*....*(k+1) / 1*2*3*...*(n-k)
= (n/1)*((n-1)/2)*((n-2)/3)*...((k+1)/(n-k))

程式 main 中:
int N, K, n,r,i;
cout << "請輸入N:";
cin >> N;
cout << "請輸入K:";
cin >> K;

// 二項式係數
cout << "C(N,K)=" << Bin(N,K); //只是印出 C(N,K) 的值

for (n=0;n<=N;n++) {  // 決定印出幾層的巴斯卡三角形
for (r=0;r<=n;r++) {  // 決定印出該層巴斯卡三角形的每個 C(N,K) 數值
long nCr = 1;
for(i=1;i<=r;i++) {
// 計算 C(N,K) 值,
//如上所推理的:C(n,k) = (n/1)*((n-1)/2)*((n-2)/3)*...((k+1)/(n-k))
//第一個數:n/1 為 (n-1+1)/1,第二個數:(n-1)/2 為 (n-2+1)/2
//第三個數:(n-2)/3 為 (n-3+1)/3.....
//依此類推,第i個數: (n-i+1)/i
//C(n,k)為第一個數*第二個數*....*第i個數,所以為累乘
nCr = nCr * (n-i+1)/i;

}
cout << nCr;
}
cout << "\n";
}

system ("pause");
return 0 ;
已有 1 人評分威望 收起 理由
紅塵孤鳥 + 2 感謝您熱心幫助會員解決問題,論壇需要您 ...

總評分: 威望 + 2   查看全部評分

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-11-1 14:37

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部