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

#include "stdafx.h"
#include <string.h>
 
// 这是一个掷色子的程序.
 
// 假设有六个色子同时掷出,求各个色子数值之和的概率 
// 六个色子之和最小是6,最大是36。
// 可以分配一个容量为31的数组Sum[31],用来存放每个求和出现的次数。
// 6出现的次数应该存放在Sum[0]中,36出现的次数应该存放在Sum[30]中。
 
1. 首先给出一个递归算法
void Sum(int nSievesint nTotalSievesint summaryintresult)
{
	if(nSieves == 0)
	{
		result[summary - nTotalSieves] ++;
		return;
	}
	else
	{
		for(int index = 1; index <= 6; index++)
		{
			summary += index;
			nSieves --;
 
			Sum(nSievesnTotalSievessummaryresult);
 
			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(nn, 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_TCHARargv[]) {     ThrowSieves(6);
    //ThrowSieves_NoRecursive(6);
    char exit; 
    scanf_s("%c", &exit); return 0;
}
posted @ 2014-04-22 23:13  临风远望  阅读(933)  评论(0编辑  收藏  举报