首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

n个骰子的点数个数?解决方案

2012-08-03 
n个骰子的点数个数?一道面试题:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可

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

  现在我想知道这个S有多少个值. 用数学中哪个公式可以表示出来?
  谢谢!!


[解决办法]
排列组合问题,这个不需要公式吧,S介于最小值和最大值之间
最小值是n,最大值是6n;即 n<=S<=6n
[解决办法]
本以为会很简单,没想到手痒写了一下,我只能写这么长了:

C/C++ code
#include <vector>#include <iostream>#include <map>#include <numeric>using namespace std;typedef vector<size_t> NumVec;typedef NumVec::const_iterator NumVecCIter;typedef map<size_t,NumVec > PotentialMap;void BuildMapTo(PotentialMap& rMap,size_t n){    if(n == 1)    {        return;    }    if(rMap.rbegin()->first < n-1 )    {        BuildMapTo(rMap, n-1);    }    const NumVec& vec = (rMap[n-1]);    rMap.insert( make_pair(n,NumVec()));    NumVec& vecN = (rMap[n]);    const int iSize = (int)vec.size();    for(int i=-5;i< iSize;++i)    {        size_t iSum = 0;        for(int j=0;j<6;++j)        {            if(i+j>=0 && i+j < iSize)                iSum += vec[i+j];        }        vecN.push_back(iSum);    }}const NumVec& GetPotential(size_t nDiceNum){    static PotentialMap mapPotential;    if(mapPotential.empty())    {        NumVec vecFirst(6,1);        mapPotential.insert( make_pair(1,vecFirst));    }    if( mapPotential.rbegin()->first < nDiceNum )        BuildMapTo(mapPotential, nDiceNum);    return mapPotential[nDiceNum];}const int ValidDiceNumMax = 12;int main(){    int iNum;    do    {        cout << "input your dice num(1-12)[any other value to exit]:";        cin >> iNum;        if(iNum <1 || iNum >ValidDiceNumMax)        {            break;        }        const NumVec& vec = GetPotential(iNum);        const size_t iPotentialNum = accumulate(vec.begin(),vec.end(),0);        cout << "value\t:  potential percent"<<endl;        double dPercentSum=0;        for(size_t i=0;i<vec.size();++i)        {            double percent = vec[i] * 1.0 / iPotentialNum * 100.0;            dPercentSum += percent;            cout << "  " << iNum++ << "\t\t" << percent << endl;        }        cout << "sum of percent is:   " << dPercentSum << "\n" << endl;    }while(1);} 

热点排行