剑指offer 面试题43 n个骰子点数和的分布律
来源:互联网 发布:exescope软件下载 编辑:程序博客网 时间:2024/05/09 03:15
n个骰子点数全排列
#include <iostream>using namespace std;//fuction to list all combinationsvoid DiceComb(int *NumArray,int n,int flag){if(flag==n){for(int i=0;i<n;++i)cout<<NumArray[i]<<' ';cout<<endl;return;}for(int i=1;i<=6;++i){NumArray[flag]=i;DiceComb(NumArray,n,flag+1);}}void Dice(int n){if(n<=0) return;int* NumArray=new int[n];DiceComb(NumArray,n,0);delete[] NumArray;}int main(){Dice(3);}
进一步改造为点数求和求分布律
#include <iostream>using namespace std;//get base^expint Power(int base,int exp){int result=1;while(exp>0){result*=base;--exp;}return result;}//recursion all the combinition and calcu sumvoid ProbalityCore(int* list,int* flag,int len,double* res){if(flag==list+len){int sum=0;for(int i=0;i<len;++i)sum+=list[i];res[sum-len]++;return;}for(int i=1;i<7;++i){*flag=i;ProbalityCore(list,flag+1,len,res);}}void Probality(int n){if(n<=0) return;int* list=new int [n];//define result tableint reslen=6*n-n+1;double* res=new double[reslen];for(int i=0;i<reslen;++i)res[i]=0;//recursion to modify the result tableProbalityCore(list,list,n,res);//divide 6^n to get the probality,then coutfor(int i=0;i<(6*n-n+1);++i){res[i]/=Power(6,n);cout<<i+n<<' '<<res[i]<<'\n';}//free the dynamic memorydelete[] list;delete[] res;}int main(){Probality(3);}剔除点数组合的版本
void DiceComb(int *SumArray,int n,int flag,int Sum){if(flag==n){SumArray[Sum-n]++;return;}for(int i=1;i<=6;++i){int CurSum=Sum;CurSum+=i;DiceComb(SumArray,n,flag+1,CurSum);}}void Dice(int n){if(n<=0) return;//initial the SumArrayint SumArrayLen=6*n-n+1;int* SumArray=new int[SumArrayLen];for(int i=0;i<SumArrayLen;++i)SumArray[i]=0;//recursion helps the SumArray make senceDiceComb(SumArray,n,0,0);//cout the resultfor(int i=0;i<SumArrayLen;++i)cout<<i+n<<' '<<SumArray[i]<<endl;//free the dynamic memorydelete[] SumArray;}int main(){Dice(3);}
进一步求分布律
int Power(int base,int exp){int res=1;while(exp>0){res*=base;exp--;}return res;}void DiceComb(int *SumArray,int n,int flag,int Sum){if(flag==n){SumArray[Sum-n]++;return;}for(int i=1;i<=6;++i){int CurSum=Sum;CurSum+=i;DiceComb(SumArray,n,flag+1,CurSum);}}void Dice(int n){if(n<=0) return;//initial the SumArrayint SumArrayLen=6*n-n+1;int* SumArray=new int[SumArrayLen];for(int i=0;i<SumArrayLen;++i)SumArray[i]=0;//recursion helps the SumArray make senceDiceComb(SumArray,n,0,0);//cout the resultfor(int i=0;i<SumArrayLen;++i)cout<<i+n<<' '<<(double)SumArray[i]/Power(6,n)<<endl;//free the dynamic memorydelete[] SumArray;}
方法2:不用递归
void Dice_2(int n){if(n<=0) return;//initialize 2 arrayint ArrayLen=n*6+1;int* res[2];res[0]=new int [ArrayLen];res[1]=new int [ArrayLen];for(int i=0;i<ArrayLen;++i){res[0][i]=0;res[1][i]=0;}//first dicefor(int i=1;i<7;++i)res[0][i]=1;int flag=0;for(int k=2;k<=n;k++){//kth dicefor(int j=0;j<k;++j)res[1-flag][j]=0;for(int j=k;j<=k*6;++j){//clear the previous value,essential!res[1-flag][j]=0;//set value according to another arrayfor(int i=j-1;i>=0&&i>=j-6;i--){res[1-flag][j]+=res[flag][i];}}flag=1-flag;}for(int i=n;i<=n*6;i++){cout<<i<<' '<<(double)res[flag][i]/Power(6,n)<<'\n';}delete[] res[0];delete[] res[1];}
完整代码
#include <iostream>using namespace std;/*//fuction to list all combinationsvoid DiceComb(int *NumArray,int n,int flag){if(flag==n){for(int i=0;i<n;++i)cout<<NumArray[i]<<' ';cout<<endl;return;}for(int i=1;i<=6;++i){NumArray[flag]=i;DiceComb(NumArray,n,flag+1);}}void Dice(int n){if(n<=0) return;int* NumArray=new int[n];DiceComb(NumArray,n,0);delete[] NumArray;}*///fuction to int Power(int base,int exp){int res=1;while(exp>0){res*=base;exp--;}return res;}void DiceComb(int *SumArray,int n,int flag,int Sum){if(flag==n){SumArray[Sum-n]++;return;}for(int i=1;i<=6;++i){int CurSum=Sum;CurSum+=i;DiceComb(SumArray,n,flag+1,CurSum);}}void Dice(int n){if(n<=0) return;//initial the SumArrayint SumArrayLen=6*n-n+1;int* SumArray=new int[SumArrayLen];for(int i=0;i<SumArrayLen;++i)SumArray[i]=0;//recursion helps the SumArray make senceDiceComb(SumArray,n,0,0);//cout the resultfor(int i=0;i<SumArrayLen;++i)cout<<i+n<<' '<<(double)SumArray[i]/Power(6,n)<<endl;//free the dynamic memorydelete[] SumArray;}void Dice_2(int n){if(n<=0) return;//initialize 2 arrayint ArrayLen=n*6+1;int* res[2];res[0]=new int [ArrayLen];res[1]=new int [ArrayLen];for(int i=0;i<ArrayLen;++i){res[0][i]=0;res[1][i]=0;}//first dicefor(int i=1;i<7;++i)res[0][i]=1;int flag=0;for(int k=2;k<=n;k++){//kth dicefor(int j=0;j<k;++j)res[1-flag][j]=0;for(int j=k;j<=k*6;++j){//clear the previous value,essential!res[1-flag][j]=0;//set value according to another arrayfor(int i=j-1;i>=0&&i>=j-6;i--){res[1-flag][j]+=res[flag][i];}}flag=1-flag;}for(int i=n;i<=n*6;i++){cout<<i<<' '<<(double)res[flag][i]/Power(6,n)<<'\n';}delete[] res[0];delete[] res[1];}int main(){Dice(3);Dice_2(3);}
0 0
- 剑指offer 面试题43 n个骰子点数和的分布律
- 剑指offer面试题43 n个骰子的点数
- 【剑指offer】面试题43:n个骰子的点数
- 剑指Offer:面试题43 n个骰子的点数
- 面试题43:n个骰子的点数(《剑指offer》)
- 剑指offer-面试题43:n个骰子的点数
- 剑指offer面试题43:n个骰子的点数
- 剑指offer-面试题43-n个骰子的点数
- 剑指offer 面试题43 n个骰子的点数
- 《剑指Offer》学习笔记--面试题43:n个骰子的点数
- 剑指offer 面试题43—n个骰子的点数
- 剑指Offer面试题43(Java版):n个骰子的点数
- 【剑指offer】6.4抽象建模能力——面试题43:n个骰子的点数
- 剑指offer——面试题43:n个骰子的点数
- 剑指Offer面试题43(Java版):n个骰子的点数
- 剑指Offer面试题43n个骰子的点数(动态规划),面试题44扑克牌的顺子
- 面试题43:n个骰子的点数
- 面试题43:n个骰子的点数
- cocos2dx问题解决记录
- postfix最简单配置
- NSDateFormatter 'YYYY' 和 'yyyy' 的区别
- UVA 12563 Jin Ge Jin Qu hao(DP)
- C和C++宏定义详解
- 剑指offer 面试题43 n个骰子点数和的分布律
- 为什么那么喜欢c
- 矩阵快速幂(poj3070)、快速幂
- Mac下为Android项目添加Maven
- 时间规划
- 怎么加载包含文件
- 头文件和库的理解
- 【Unity快速实现小功能】NGUI篇——快速实现一个可滑动列表
- java中读取服务器配置文件方法