一、算法描述
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印s的所有可能的值得出现的概率
二、算法实现
/*************************************************************************
> File Name: PrintProbability.c
> Author: cyf
> Mail: 1097189275@qq.com
> Created Time: 2016年03月28日 星期一 11时33分37秒
************************************************************************/
#include "PrintProbability.h"
int g_maxvalue = 6;
int PrintProbability(int number)
{
int ret = 0;
if (number < 1)
{
ret = -1;
return ret;
}
int maxvalue = number*g_maxvalue;
int pProbability[maxvalue-number+1];
int i;
for(i=number; i<=maxvalue; i++)
pProbability[i-number]=0;
Probability(number, pProbability);
int total = pow((double)g_maxvalue, (double)number);
for(i=number; i<=maxvalue; i++)
{
double ratio = (double)pProbability[i-number]/total;
printf("%d:%e\n", i, ratio);
}
return ret;
}
int Probability(int number, int *pProbability)
{
int ret = 0;
if (number < 1 || pProbability == NULL)
{
ret = -1;
printf("func Probability() err:%d, input:%s", ret, "pProbability");
return ret;
}
int i;
for(i=1; i<=g_maxvalue; i++)
Prob(number, number, i, pProbability);
return ret;
}
int Prob(int original, int current, int sum, int *pProbability)
{
int ret = 0;
if (pProbability == NULL)
{
ret = -1;
printf("func Probability() err:%d, input:%s", ret, "pProbability");
return ret;
}
int i;
if(current==1)
pProbability[sum-original]++;
else
{
for(i=1;i<=g_maxvalue;i++)
Prob(original, current-1, i+sum, pProbability);
}
return ret;
}
/*************************************************************************
> File Name: PrintProbability.h
> Author: cyf
> Mail: 1097189275@qq.com
> Created Time: 2016年03月28日 星期一 11时33分28秒
************************************************************************/
#ifndef PRINTPROBABILITY_H
#define PRINTPROBABILITY_H
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int PrintProbability(int number);
int Probability(int number, int *pProbability);
int Prob(int original, int current, int sum, int *pProbability);
#endif
/*************************************************************************
> File Name: main.c
> Author: cyf
> Mail: 1097189275@qq.com
> Created Time: 2016年03月28日 星期一 11时33分48秒
************************************************************************/
/*
* 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印s的所有可能的值得出现的概率
* */
#include "PrintProbability.h"
int main()
{
int ret = 0;
int number = 2;
ret = PrintProbability(number);
if (ret == -1)
{
printf("func PrintProbability() err:%d,input:%d\n", ret, number);
}
return 0;
}
CC = gcc
CFLAGS = -g -lm
%.o:%.c
$(CC) -o $@ -c $(CFLAGS) $<
main:main.o PrintProbability.o
$(CC) main.o PrintProbability.o -o main $(CFLAGS)
clean:
rm -rf *.o main