n个骰子的点数

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

s可能出现的值的范围为:n--6*n

1.递归思想

通过递归的思想将n个骰子的点数累加。

要求出n个骰子的点数和,可以先求出前n-1个骰子的点数和,然后加上第n个骰子的点数;

递归结束条件:n=1,此时某个点数和出现的次数+1;

#include <iostream>
#include <math.h>
using namespace std;

void pro(int number,int cur,int sum,int *p)
{
    if(cur==1)
        p[sum-number]++;
    else
    {
        for(int i=1;i<=6;i++)
        {
            pro(number,cur-1,sum+i,p);
        }
    }
}

void pro(int number,int *p)
{
    for(int i=1;i<=6;i++)
        pro(number,number,i,p);
}

void PrintPro(int n)
{
    if(n<1)
        return;
    int maxnum=6*n;
    int *probability=new int[maxnum-n+1];
    for(int i=0;i<maxnum-n+1;i++)
        probability[i]=0;

    pro(n,probability);

    int total=pow(6,n);
    for(int i=0;i<maxnum-n+1;i++)
    {
        double ratio=(double)probability[i]/(double)total;
        cout<<i+n<<' '<<ratio<<endl;
    }
    delete []probability;
}


int main()
{
    PrintPro(5);
    return 0;
}
原文地址:https://www.cnblogs.com/home123/p/7239397.html