首页 > 代码库 > n个骰子的点数
n个骰子的点数
把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值和出现的概率。
解法一:基于递归求骰子点数。
1 /////////////////基于递归求骰子点数///////////////////////////////////////////////////////// 2 int g_MaxValue = http://www.mamicode.com/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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。