n个骰子的点数
2015-09-05 15:49
274 查看
把n个骰子扔在地上,所以骰子朝一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率
#include <iostream> #include <math.h> using namespace std; int g_maxValue = 6; void Probability(int number, int current, int sum, int* Probabilities) { if(current == 1) { Probabilities[sum - number]++; } else { for(int i =1; i <= g_maxValue; i++) Probability(number, current-1, sum+i, Probabilities); } } void Probability(int number, int* Probabilities) { for(int i = 1; i <= g_maxValue; i++) { Probability(number, number, i, Probabilities); } } void printProbilites(int number) { if(number < 1) return; int maxNum = number * g_maxValue; int* Probabilities = new int[maxNum - number +1]; for(int i = number; i <= maxNum; i++) Probabilities[i - number] = 0 ; Probability(number, Probabilities); int total = pow((double)g_maxValue, number); for(int i= number; i <= maxNum; i++) { double ratio = (double)Probabilities[i - number]/total; printf("%d: %e\n",i,ratio); } delete[] Probabilities; } // ====================方法二==================== void PrintProbability_Solution2(int number) { if(number < 1) return; int* pProbabilities[2]; pProbabilities[0] = new int[g_maxValue * number + 1]; pProbabilities[1] = new int[g_maxValue * number + 1]; for(int i = 0; i < g_maxValue * number + 1; ++i) { pProbabilities[0][i] = 0; pProbabilities[1][i] = 0; } int flag = 0; for (int i = 1; i <= g_maxValue; ++i) pProbabilities[flag][i] = 1; for (int k = 2; k <= number; ++k) { for(int i = 0; i < k; ++i) pProbabilities[1 - flag][i] = 0; for (int i = k; i <= g_maxValue * k; ++i) { pProbabilities[1 - flag][i] = 0; for(int j = 1; j <= i && j <= g_maxValue; ++j) pProbabilities[1 - flag][i] += pProbabilities[flag][i - j]; } flag = 1 - flag; } double total = pow((double)g_maxValue, number); for(int i = number; i <= g_maxValue * number; ++i) { double ratio = (double)pProbabilities[flag][i] / total; printf("%d: %e\n", i, ratio); } delete[] pProbabilities[0]; delete[] pProbabilities[1]; }
// ====================测试代码==================== void Test(int n) { printf("Test for %d begins:\n", n); printf("Test for solution1\n"); printProbilites(n); printf("Test for solution2\n"); PrintProbability_Solution2(n); printf("\n"); } int main(int argc, char* argv[]) { Test(1); Test(2); Test(3); Test(4); Test(11); Test(0); return 0; }
相关文章推荐
- TCP协议疑难杂症解析
- sharepoint 2016 学习系列篇(2)-如何部署sharepoint server 2016(1)-AD域服务器安装和部署
- 使用JDK自带jvisualvm监控tomcat
- Leetcode: H-Index
- 常见编程语言分析
- 剑指Offer系列---(2)求链表中的倒数第k个结点
- 概率导论 MITx: 6.041x Introduction to Probability 视频网盘下载
- WCF服务编程 读书笔记——第2章 服务契约
- 浅谈linux中的grub
- 2015收获的季节
- Find Peak Element —— Leetcode
- Struts2 part 7:文件上传
- 简单的C++游戏载入界面设计
- 关于动态代理的初步认识
- c++のeof
- sharepoint 2016 学习系列篇(1)-关于sharepoint
- POJ1039Pipe【线段相交判断+求交点】
- Erdas的Model Maker功能
- AngularJS 应用身份认证的技巧
- 照明