// 面试题60:n个骰子的点数
// 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s
// 的所有可能的值出现的概率。 #include <iostream>
#include <math.h> int g_maxValue = ; // ====================方法一====================
//使用递归,还是会有重复计算
void Probability(int number, int* pProbabilities);
void Probability(int original, int current, int sum, int* pProbabilities); void PrintProbability_Solution1(int number)
{
if (number < )
return; int maxSum = number * g_maxValue;
int* pProbabilities = new int[maxSum - number + ];//建立一个长为maxSum - number + 1的数组,用来统计次数
for (int i = number; i <= maxSum; ++i)//初始化为0
pProbabilities[i - number] = ; Probability(number, pProbabilities);//统计次数 int total = pow((double)g_maxValue, number);
for (int i = number; i <= maxSum; ++i)
{
double ratio = (double)pProbabilities[i - number] / total;
printf("%d: %e\n", i, ratio);
} delete[] pProbabilities;
} void Probability(int number, int* pProbabilities)
{
for (int i = ; i <= g_maxValue; ++i)
Probability(number, number, i, pProbabilities);
} //划分为1个和n-1个两堆色子,然后迭代如此划分,遍历所有可能,然后pProbabilities数组相应加1
void Probability(int original, int current, int sum, int* pProbabilities)
{
if (current == )
{
pProbabilities[sum - original]++;
}
else
{
for (int i = ; i <= g_maxValue; ++i)
{
Probability(original, current - , i + sum, pProbabilities);
}
}
} // ====================方法二====================
//使用循环方法,需要找到统计新的一个色子的规律
void PrintProbability_Solution2(int number)
{
if (number < )
return; int* pProbabilities[];
pProbabilities[] = new int[g_maxValue * number + ];
pProbabilities[] = new int[g_maxValue * number + ];
for (int i = ; i < g_maxValue * number + ; ++i)//建立两个数组,初始化为0
{
pProbabilities[][i] = ;
pProbabilities[][i] = ;
} int flag = ;
for (int i = ; i <= g_maxValue; ++i)
pProbabilities[flag][i] = ;//第一个色子,每个值出现次数为1,值1~g_maxValue for (int k = ; k <= number; ++k)//从第二个色子开始统计
{
for (int i = ; i < k; ++i)
pProbabilities[ - flag][i] = ;//把另一个数组的k之前的次数清零,因为那是以前的统计结果,后面不可能出现的值 for (int i = k; i <= g_maxValue * k; ++i)//对于另一个数组而言,统计一个新的色子,其每个和的次数等于当前数组的前六个值的和
{
pProbabilities[ - flag][i] = ;
for (int j = ; j <= i && j <= g_maxValue; ++j)
pProbabilities[ - flag][i] += pProbabilities[flag][i - j];
} flag = - 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[];
delete[] pProbabilities[];
} // ====================测试代码====================
void Test(int n)
{
printf("Test for %d begins:\n", n); printf("Test for solution1\n");
PrintProbability_Solution1(n); printf("Test for solution2\n");
PrintProbability_Solution2(n); printf("\n");
} int main(int argc, char* argv[])
{
Test();
Test();
Test();
Test(); Test(); Test();
system("pause");
return ;
}

《剑指offer》第六十题(n个骰子的点数)的更多相关文章

  1. 《剑指offer》 面试题43 n个骰子的点数 (java)

    引言:写这篇文章的初衷只是想做个笔记,因为这道题代码量有点大,有点抽象,而书上并没有详细的注释.为了加深印象和便于下次复习,做个记录. 原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入 ...

  2. 《剑指offer》第二十题(表示数值的字符串)

    // 面试题20:表示数值的字符串 // 题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如, // 字符串“+100”.“5e2”.“-123”.“3.1416”及“-1E-16 ...

  3. 《剑指offer》第十题(斐波那契数列)

    // 面试题:斐波那契数列 // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. #include <iostream> using namespace std; ...

  4. 《剑指offer》面试题60. n个骰子的点数

    问题描述 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i ...

  5. 剑指Offer(二十六):二叉搜索树与双向链表

    剑指Offer(二十六):二叉搜索树与双向链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  6. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  7. 剑指Offer(二十二):从上往下打印二叉树

    剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  8. 剑指Offer(二十五):复杂链表的复制

    剑指Offer(二十五):复杂链表的复制 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/bai ...

  9. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  10. 剑指Offer(三十二):把数组排成最小的数

    剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

随机推荐

  1. EDK II之DXE Core的事件管理

    本文简单介绍一下UEFI中的事件管理: UEFI是不支持多进程的,但是UEFI支持多事件分发机制.UEFI只支持时钟中断,并基于时钟中断实现事件分发.类似于OS中基于时钟中断来实现基于时间片的多任务调 ...

  2. mysql引擎和事务

    对于应用程序和用户来说,同样一张表的数据无论用什么引擎来存储,看到的数据都是一样的,只是不同的引擎在功能.占用空间大小.读取性能等方面可能有所差别. mysql最常用的存储引擎为Innodb.MyIS ...

  3. P1384 幸运数与排列

    P1384 幸运数与排列 神奇的(逆)康托展开:求1到n的全排列中字典序第k小的排列 $k<=10^9<13!$,显然$k$最多只会影响后$13$位 前面一大串都是有序从小到大排列的,于是 ...

  4. C# ms speech文字转语音例子

    最近突发奇想 想玩玩  文字转语音的东东   谷歌了一下 发现微软有一个TTS 的SDK   查了查相关资料  发现 还真不错  然后就开始玩玩Microsoft Speech SDK的 DEMO了 ...

  5. LVS+Keepalived+Mysql+主备数据库架构[4台]

    这是一个坑...磨了不少时间.见证自己功力有待提升... 架构图 数据库 1.安装数据库 这块不难, 直接引用:mysql安装 2.数据库主备 这块不难, 直接引用: mysql主备 虚拟VIP 重点 ...

  6. 安装kali linux 2017.1 【一、更新源 升级软件和内核等】

    呃,我这次安装是在VMware WorkStation里进行的,具体操作系统安装步骤不谈. ISO文件下载地址:https://www.kali.org/downloads/ 说下安装后的升级操作.下 ...

  7. 20165310 NetSec2019 Week5 Exp3 免杀原理与实践

    20165310 NetSec2019 Week5 Exp3 免杀原理与实践 一.免杀原理 杀软是如何检测出恶意代码的 基于特征码的检测:特征码就是一段恶意程序有但是正常程序没有的一段代码,当杀软检测 ...

  8. fatal: unable to access 'https://github.com/open-falcon/falcon-plus.git/': Peer reports incompatible or unsupported protocol version

    git通过git clone下载github上的资源到机器上,结果出现如题所示的错误. [root@server data]# git clone https://github.com/pingcap ...

  9. Actions对Element的一些操作解析

    针对Chrome浏览器: 在自动化测试的编写中如果报出Element is not visible to click at xxxx point时,我会使用: new Actions(WebDrive ...

  10. H5、React Native、Native性能区别选择

    “存在即合理”.凡是存在的,都是合乎规律的.任何新事物的产生总要的它的道理:任何新事物的发展总是有着取代旧事物的能力.React Native来的正是时候,一则是因为H5发展到一定程度的受限:二则是移 ...