新增6 n个骰子的点数

 

 

/*
*
* 面试题43:n个骰子的点数
* 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。
* 输入n,打印出s的所有可能的值出现的概率。
*
*/

#include <iostream>
#include <cmath>

using namespace std;

const int max_val = 6;

//核心,计算概率
//original为起始值,n个骰子起始值为n
//current为当前骰子个数
//骰子数之和
//和对应的次数
void probalility(int original, int current, int sum, int *probabilities)
{
    if (current == 1) {
        probabilities[sum - original]++;
    }
    else{
        //每个骰子都有六种可能
        for (int i = 1; i <= max_val; i++) {
            probalility(original, current - 1, i + sum, probabilities);
        }
    }
}
//计算概率
void probalility(int number, int *probabilities)
{
    for (int i = 1; i <= max_val; i++) {
        probalility(number, number, i, probabilities);
    }
}


void PrintPrabability(int number)
{
    if (number < 1) {
        return;
    }
    //申请空间
    int max_sum = number * max_val;
    int *probabilities = new int[max_sum];
    for (int i = number; i <= max_sum; i++) {
        probabilities[i] = 0;
    }
    //计算可能的情况
    probalility(number, probabilities);

    //计算概率
    int total = pow(double(max_val), number);
    for (int i = number; i <= max_sum; i++) {
        double ratio = (double)probabilities[i - number] / total;
        cout << i << " " << ratio << endl;
    }
}

 

posted @ 2018-03-20 23:22  zqlucky  阅读(268)  评论(0编辑  收藏  举报