把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; }