#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;
}