题目:把n枚骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
#include "stdafx.h" #include <vector> #include <iostream> #include <math.h> using namespace std; void num_cnt(int offset,int* cnt,int num,int sum) { if(num==0) { cnt[sum-offset]++; return; } else { for(int i=1;i<=6;i++) { num_cnt(offset,cnt,num-1,sum+i); } } return; } void probality(int num) { int *cnt=new int[6*num-num+1]; memset(cnt,0,(6*num-num+1)*sizeof(int)); int sum=0; num_cnt(num,cnt,num,sum); double base=6.0; double total=pow(base,num); for(int i=0;i<6*num-num+1;i++) { cout<<cnt[i]<<" "; } cout<<endl; return; } void num_cnt1(int n) { int* s[2]; s[0]=new int[n*6+1]; s[1]=new int[n*6+1]; for(int i=0;i<n*6+1;i++) { s[0][i]=0; s[1][i]=0; } for(int i=1;i<=6;i++) { s[0][i]=1; } int flag=1; for(int k=2;k<=n;k++) { for(int j=1;j<6*n+1;j++) { s[flag][j]=0; } for(int j=k;j<=6*k;j++) { for(int m=(j-6>=k-1 ? j-6 : k-1);m>=k-1 && m<j;m++) { s[flag][j]+=s[1-flag][m]; } } flag=1-flag; } for(int i=n;i<=6*n;i++) { cout<<s[1-flag][i]<<" "; } cout<<endl; return ; } int main(void) { int n=3; num_cnt1(n); probality(n); system("pause"); return 0; }
时间: 2024-11-25 21:49:12