程序员面试题精选100题(43)-n个骰子的点数

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

用一个HashMap,把所有计算的和都存进去,如果出现多次,那么对应的value++;那么我们就可以知道每个值到此出现了多少次;可以使用递归来做
[code]
Map p = new HashMap();
public void getCount(int n,int he){
if(n==0){
if(p.get(he)!=null){
p.put(he,p.get(he)+1);
}else{
p.put(he,1);
}
return;
}
for(int i=1;i<=6;i++){
get(n-1,he+i);
}
}
[/code]

递归往往很多重复计算。。。。
因为第n个位置是n-1,n-6位置的值晋升过来的,而第n位置也会晋升到n+1...n+6
所以可以使用下面的代码

[code]
int[] a1 = new int[5*6+1] ;
for (int i = 0; i < a1.length; i++) {
a1[i]=0;
}

for (int i = 1; i <=6; i++) {
a1[i]=1;
}
// {0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 };

int[] a2 = new int[5*6+1];// {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0};
for (int i = 0; i < a2.length; i++) {
a2[i]=0;
}
for (int n = 2; n <= 4; n++) {//第2个到第4个筛子加入
for (int i = 1 ; i <= (6 * n); i++) {//加入几个筛子,就遍历到加入的最大的数(2个骰子的和最大为12)
a2[i] = 0; //记录计算过程
for (int j = 1; j <= 6; j++) {
if (i - j >= 1)
a2[i] += a1[i - j]; //a2[i]中记录了i-1到i-6的结果和
}
}
for (int i = 0; i < a2.length; i++) {
a1[i]=a2[i];
}


for (int i = 0; i < a1.length; i++) {
System.out.print(a1[i] + " ");
}
System.out.print("\n");
}

[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值