剑指offer 43. n个骰子的点数

来源:互联网 发布:sql添加语句 编辑:程序博客网 时间:2024/06/06 03:52
// n个骰子的点数// 把n个骰子扔在地上,点数之和为s,输入个数n,打印出所有可能的值出现的概率//解法1:两个矩阵迭代相加,一个点数等于之前6个点数相加public class Main {public static void main(String[] args) throws Exception {printPro(1);}public static void printPro(int n) {if(n<1){return;}int[][] matrix = new int[2][6*n];int flag = 0;for(int i = 0;i<6;i++){matrix[flag][i] = 1;}for(int i = 1;i<n;i++){for(int j = 0;j<i;j++){matrix[1-flag][j] = 0;}for(int j = i;j<6*(i+1);j++){matrix[1-flag][j] = 0;for(int k = j-1;k>=j-6 && k>=0;k--){matrix[1-flag][j] = matrix[1-flag][j] + matrix[flag][k];}}flag = 1-flag;}double total = Math.pow(6,n);for(int i = n;i<=6*n;i++){System.out.println(i+" : "+matrix[flag][i-1]/total);}}}//解法2:使用递归,直接计算每个点数出现的次数public class Main {public static void main(String[] args) throws Exception {printPro(2);}public static void printPro(int n) {if(n<1){return;}int[] pro = new int[n*6-n+1];  for(int i = n;i<=6*n;i++){pro[i-n] = 0;}int curSum = 0;ProBa(n,n,curSum,pro);double total = Math.pow(6,n);for(int i = n;i<=6*n;i++){System.out.println(i+" : "+pro[i-n]/total);}}public static void ProBa(int ori, int index, int curSum, int[] pro){if(index == 0){pro[curSum-ori] = pro[curSum-ori]+1;return;}for(int i = 1;i<=6;i++){ProBa(ori,index-1,curSum+i,pro);}}}

0 0