n个骰子的点数(非递归) 代码(C)
本文地址: http://blog.csdn.net/caroline_wendy
题目: 把n个骰子仍在地上, 所有骰子朝上一面的点数之和为s. 输入n, 打印出s的所有可能的值出现的概率.
每次骰子的循环过程中, 本次等于上一次n-1, n-2, n-3, n-4, n-5, n-6的次数的总和.
代码:
/* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> using namespace std; void PrintProbability(int number) { const int g_maxValue = 6; if (number<1) return; int* pProbabilities[2]; pProbabilities[0] = new int[g_maxValue*number+1]; pProbabilities[1] = new int[g_maxValue*number+1]; for (int i=0; i<g_maxValue*number+1; ++i) { pProbabilities[0][i] = 0; pProbabilities[1][i] = 0; } int flag = 0; for (int i=1; i<=g_maxValue; ++i) pProbabilities[flag][i] = 1; for (int k=2; k<=number; ++k) { for (int i=0; i<k; ++i) pProbabilities[1-flag][i] = 0; for (int i=k; i<=g_maxValue*k; ++i) { pProbabilities[1-flag][i] = 0; for (int j=1; j<=i && j<=g_maxValue; ++j) pProbabilities[1-flag][i] += pProbabilities[flag][i-j]; } flag = 1-flag; } double total = pow((double)g_maxValue, number); for (int i=number; i<=g_maxValue*number; ++i) { double ratio = (double)pProbabilities[flag][i]/total; printf("%d: %e\n", i, ratio); } delete[] pProbabilities[0]; delete[] pProbabilities[1]; } int main(void) { PrintProbability(2); return 0; }
输出:
2: 2.777778e-002 3: 5.555556e-002 4: 8.333333e-002 5: 1.111111e-001 6: 1.388889e-001 7: 1.666667e-001 8: 1.388889e-001 9: 1.111111e-001 10: 8.333333e-002 11: 5.555556e-002 12: 2.777778e-002
编程算法 - n个骰子的点数(非递归) 代码(C)
时间: 2024-10-10 09:36:03