剑指Offer(第二版)面试题60:n个骰子的点数
2018-01-21 09:44
363 查看
剑指Offer(第二版)面试题60:n个骰子的点数
题目要求:
把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值的出现概率。解题思路:
解法一:基于递归求骰子点数,时间效率不够高。解法二:基于循环求骰子点数,时间性能好。
新加入一个骰子,它出现1-6的概率是相等的,可以看成各出现一次,那么出现和为s的次数等于再加入之前出现和为s-1,s-2,s-3,s-4,s-5,s-6这6种情况的次数之和。如此循环,直到加入n个骰子结束。
参考代码:
#include <iostream> #include <cmath> using namespace std; void PrintProbability(int number); int g_maxValue = 6; int main() { int input; cin >> input; while(input != -1) { PrintProbability(input); cin >> input; } return 0; } void PrintProbability(int number) { if(number < 1) return; int* probabilities[2]; probabilities[0] = new int[g_maxValue * number + 1]; probabilities[1] = new int[g_maxValue * number + 1]; for (int i = 0; i < g_maxValue*number + 1; ++i) { probabilities[0][i] = 0; probabilities[1][i] = 0; } int flag = 0; for (int i = 4000 1; i <= g_maxValue; ++i) { probabilities[flag][i] = 1; } for (int k = 2; k <= number; ++k) { for (int i = 0; i < k; ++i) { probabilities[1-flag][i] = 0; } for (int i = k; i <= g_maxValue * k; ++i) { probabilities[1-flag][i] = 0; for (int j = 1; j<=i && j <= g_maxValue; ++j) { probabilities[1-flag][i] += probabilities[flag][i-j]; } } flag = 1 - flag; } double total = pow((double)g_maxValue,number); for (int i = number; i <= g_maxValue * number; ++i) { double rotio = (double)probabilities[flag][i]/total; cout<< i <<":"<<rotio <<endl; } delete[] probabilities[0]; delete[] probabilities[1]; return; }
参考博客
剑指offer第二版-60.n个骰子的点数相关文章推荐
- 剑指offer 面试题43—n个骰子的点数
- 剑指offer——面试题43:n个骰子的点数
- 《剑指Offer》学习笔记--面试题43:n个骰子的点数
- (剑指Offer)面试题43:n个骰子的点数
- 剑指Offer面试题43(Java版):n个骰子的点数
- 剑指Offer面试题43n个骰子的点数(动态规划),面试题44扑克牌的顺子
- 面试题43:n个骰子的点数(《剑指offer》)
- 《剑指offer》 面试题43 n个骰子的点数 (java)
- 剑指Offer(第二版)面试题45:把数组排成最小的数
- 程序员面试题精选100题(43)-n个骰子的点数
- 剑指Offer(第二版)面试题4:二维数组中的查找
- (剑指Offer)面试题60:把二叉树打印成多行
- 剑指Offer(第二版)面试题6:从尾到头打印链表
- 剑指Offer(第二版)面试题7:重建二叉树
- 剑指Offer(第二版)面试题53:在排序数组中查找数字出现的次数
- 面试题43:n个骰子的点数
- 剑指offer 面试题43 n个骰子的点数 - null
- 《剑指Offer》学习笔记--面试题60:把二叉树打印出多行
- 面试题43:骰子的点数
- 剑指Offer(第二版)面试题44:数字序列中某一位的数字