#include "stdafx.h" #include <string.h> // 这是一个掷色子的程序. // 假设有六个色子同时掷出,求各个色子数值之和的概率 // 六个色子之和最小是6,最大是36。 // 可以分配一个容量为31的数组Sum[31],用来存放每个求和出现的次数。 // 6出现的次数应该存放在Sum[0]中,36出现的次数应该存放在Sum[30]中。 1. 首先给出一个递归算法 void Sum(int nSieves, int nTotalSieves, int summary, int* result) { if(nSieves == 0) { result[summary - nTotalSieves] ++; return; } else { for(int index = 1; index <= 6; index++) { summary += index; nSieves --; Sum(nSieves, nTotalSieves, summary, result); nSieves++; summary -= index; } } } void ThrowSieves(int n) { if(n <= 0) { return; } else { int nMinSum = 1*n, nMaxSum = 6*n, size = nMaxSum - nMinSum + 1; int* result = new int[nMaxSum - nMinSum + 1]; memset(result, 0, size*sizeof(int)); int summary = 0; Sum(n, n, summary, result); int nTotal = 0, index = 0; for(index = 0; index < size; index++) { nTotal += result[index]; } for(index = 0; index < size; index++) { printf("Sum=%d, Percentage=%lf\n", index+n, (double)result[index]/(double)nTotal); } delete[] result; } }
2. 下面是一个非递归算法
int g_SieveMaxValue = 6; void ThrowSieves_NoRecursive(int nSieves) { if(nSieves <= 0) { return; } int size = g_SieveMaxValue*nSieves + 1; int* pRecord1 = new int[size]; int* pRecord2 = new int[size]; memset(pRecord1, 0, sizeof(int)*(size)); memset(pRecord2, 0, sizeof(int)*(size)); pRecord1[0] = 0; pRecord1[1] = pRecord1[2] = pRecord1[3] = pRecord1[4] = pRecord1[5] = pRecord1[6] = 1; for(int indexOfSieves = 2; indexOfSieves <= nSieves; indexOfSieves++) { int minValue = indexOfSieves * 1; int maxValue = g_SieveMaxValue * indexOfSieves; if(indexOfSieves % 2 == 1) // 1,3,5 { memset(pRecord1, 0, sizeof(int)*size); for (int value = minValue; value <= maxValue; value++) { int num = 0; for(int temp = 1; temp <= g_SieveMaxValue; temp++) { int index = value - temp; if(index < 0) { break; } else { num += pRecord2[index]; } } pRecord1[value] = num; } printf("Sieve %d:\n", indexOfSieves); for(int i = 0; i < size; i++) { printf("%d ", pRecord1[i]); } } else // 2, 4, 6 { memset(pRecord2, 0, sizeof(int)*size); for(int value = minValue; value <= maxValue; value++) { int num = 0; for(int temp = 1; temp <= g_SieveMaxValue; temp++) { int index = value - temp; if(index < 0) { break; } else { num += pRecord1[index]; } } pRecord2[value] = num; } printf("Sieve %d:\n", indexOfSieves); for(int i = 0; i < size; i++) { printf("%d ", pRecord2[i]); } } } int* pResult = NULL; if(nSieves % 2 == 0) { pResult = pRecord2; } else { pResult = pRecord1; } int total = 0; for(int i = 1; i < size; i++) { total += pResult[i]; } for(int i= 1; i < size; i++) { printf("Sum: %d, Num: %d, Percentage:%lf \n", i, pResult[i], (double)pResult[i]/(double)total); } delete[] pRecord1; delete[] pRecord2; }
int _tmain(int argc, _TCHAR* argv[]) { ThrowSieves(6);
//ThrowSieves_NoRecursive(6);
char exit;
scanf_s("%c", &exit); return 0;
}
转载于:https://www.cnblogs.com/bsqdevspace/p/3679421.html