面试题43:骰子的点数

骰子个数为1:则点数和与次数的关系是: 0:0     1:1     2:1     3:1     4:1     5:1     6:1

骰子个数为2:则点数和与次数的关系是:0:0      1:0     2:1     3:2    4:3     5:4      6:5   7:6   8:5 ...

...

每增加一个骰子,则第i个元素的值,是其头6个的和

代码如下:

#include<iostream>
#include<math.h>
#include <iomanip> 

using namespace std;

const int g_maxValue = 6;

void PrintProbability(int number){
    if(number < 1){
        return;
    }
    int* pProbabilies[2];
    pProbabilies[0] = new int[g_maxValue * number + 1];
    pProbabilies[1] = new int[g_maxValue * number + 1];
    for(int i = 0; i < g_maxValue * number + 1; ++i){
        pProbabilies[0][i] = 0;
        pProbabilies[1][i] = 0;
    }
    int flag = 0;
    //当只有一个骰子时,每个值出现的次数都为1
    for(int i = 1; i <= g_maxValue; ++i){
        pProbabilies[0][i] = 1;
    }
    //其他骰子
    for(int i = 2; i <= number; ++i){
        //i个骰子,则0~i-1出现的次数为0
        for(int j = 0; j < i; ++j){
            pProbabilies[1-flag][j] = 0;
        }
        //i个骰子,从第i个开始算起
        for(int j = i; j <= g_maxValue * i; ++j){
            pProbabilies[1-flag][j] = 0;
            // 累加 i-1 i-2 i-3 ... i-6个和
            for(int k = 1; k <= g_maxValue && k <= j; ++k){
                pProbabilies[1-flag][j] += pProbabilies[flag][j-k];
            }
        }
        flag = 1 - flag;
    }
    double total = pow((double)g_maxValue, number);
    for(int i = number; i <= g_maxValue * number; ++i){
        double ratio = (double)pProbabilies[flag][i]/total;
        cout << i << ":"<< (double)pProbabilies[flag][i] << "/" << total << " " <<setw(10) << ratio << endl;
    }
    delete pProbabilies[0];
    delete pProbabilies[1];
}

int main(){
    PrintProbability(2);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值