使用C語言求解撲克牌的順子及n個骰子的點數問題

2022-09-27 00:27:16 字數 1482 閱讀 2208

撲克牌的順子

問題描述:從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2-10為數字本身,a為1,j為11,q為12,k為13,而大小王可以看成任意數字。

思路:可以將這5張牌排個序,然後統計出0的個數以及非0數字之間的間隔數,如果出現重複的非0數字,那麼不是順子。如果間隔數小於等於0的個數,那麼是順子。暫時未想到更好的辦法。

參考**:

//函式功能 : 從撲克牌中隨機抽5張牌,判斷是不是乙個順子

//函式引數 : pcards為牌,nlen為牌的張數

//返回值 : 是否順子

bool iscontinuous(int *pcards, int nlen)

//統計間隔數

int precard = pcards[i];

for(i = i + 1; i < nlen; i++)

return (zerocount >= capcount)? true: false; //只要王的個數大於間隔數

}n個骰子的點數

問題描述:把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。

思路:這是一道應用動態規劃思想的題目,而動態規劃最難的就是要找最優子結構。並採取一種稱為備忘錄的方法避免重複計算。因為備忘錄方法為每個解過的子問題建立了備忘錄,以備需要時參看,避免了相同子問題的重複求解。

本題的最優子結構為:f(k, n) 表示k個骰子點數和為n的種數,k表示骰子個數,n表示k個骰子的點數和

/ = f(k-1, n-6) + f(k-1, n-5) + f(k-1, n-4) + f(k程式設計客棧-1, n-3) + f(k-1, n-2) + f(k-1, n-1) 對於 k > 0, k <= n <= 6*k

f(k, n) =

\ = 0 對於 n < k or n > 6*k

當k=1時, f(1,1)=f(1,2)=f(1,3)=f(1,4)=f(1,5)=f(1,6)=1。

從上面公式可以看出,k個骰子點數和為n的種數只與k-1個骰子的和有關。這就可以用到備忘錄的方法,用一張**儲存已解決的子問題的解,然後自底向上填表。考慮到當前層的計算只與下一層有關,因此只需儲存一行。

參考**:

const int face_num = 6; //骰子的面數

//函式功能 : n個骰子的點數

//函式引數 : number為骰子數

//返回值 : 無

void printsumprobabilityofdices(int number)

} //不可能的情況,即i個骰子的和不可能小於i

for(j = i - 1;j >= 0; j--)

psum[j] = 0;

} //列印結果

for(i = 0; i <= size; i++)

cout

本文標題: 使用c語言求解撲克牌的順子及n個骰子的點數問題

本文位址:

撲克牌的順子

題目 從撲克牌中隨機抽 5張牌,判斷是不是乙個順子,即這 5張牌是不是連續的。2 10 為數字本身,a為 1,j為 11,q為 12,k為 13,而大小王可以看成任意數字。分析 這題目很有意思,是乙個典型的寓教於樂的題目。我們需要把撲克牌的背景抽象成計算機語言。不難想象,我們可以把 5張牌看成由 5...

撲克牌的順子

題目 從撲克牌中隨機抽5張牌 判斷是不是乙個順子 即這5張牌是不是連續的 2 10為數字本身 a為1 j為11 q為12 k為13 而大小王可以看成任意數字 思路 可以把5張牌看成由5個數字組成的陣列 大小王是特殊的數字 不妨把它定義為0 接下來就是怎麼判斷這5個數字是否連續 可以用排序的方法 由於...

撲克牌的順子

題目 從撲克牌中隨機抽取5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大 小王可以看成任意數字。方法 首先把陣列排序,再統計陣列中0的個數,最後統計排序之後的陣列中相鄰數字之間的空缺總數。如果空缺的總數小於或者等於0的個數,則這個陣列...