把n個骰子扔在地上,所有骰子朝上的一面的點數之和為s。輸入n,打印出s的所有可能的值和出現的概率。
解法一:基於遞歸求骰子點數。
1 /////////////////基於遞歸求骰子點數///////////////////////////////////////////////////////// 2 int g_MaxValue = 6 ;//骰子的點數個數 3 void Probability(int original , int current , int sum , int* pProbabilities)//original表示骰子個數,current表示剩余骰子的個數,sum表示當前和的一種情況,pProbabilities是存儲相同和出現的次數。 4 { 5 if (current == 0) 6 { 7 pProbabilities[sum - original]++ ;//數組的下標就是當前和減去最小和的值,數組裡存儲的是當前和出現的次數。 8 } 9 else 10 { 11 for (int i = 1 ; i <= g_MaxValue ; i++ ) 12 { 13 Probability(original , current - 1 , sum + i , pProbabilities); 14 } 15 } 16 } 17 18 void Probability(int number , int* pProbabilities) 19 { 20 int sum = 0 ; 21 Probability(number , number , sum , pProbabilities); 22 } 23 24 void PrintProbability(int number) 25 { 26 if (number < 1) 27 { 28 return; 29 } 30 int MaxSum = number * g_MaxValue ;//最大的和 31 int size = MaxSum - number + 1 ;//和的可能情況數 32 int* pProbabilities = new int[size]; 33 for (int i = 0 ; i < size ; i++) 34 { 35 pProbabilities[i] = 0 ;//初始化為0 36 } 37 Probability(number , pProbabilities); 38 double total = pow((double)(g_MaxValue) , number);//和的組合情況 39 for (int i = 0 ; i < size ; i++) 40 { 41 double ratio = pProbabilities[i] / total ;//概率 42 cout<< i + number<<" : "<<pProbabilities[i] <<" : "<<ratio<<endl ; 43 } 44 45 }