泊松分布
【问题描述】
泊松分布是一种常用的离散型概率分布,数学期望为m的泊松分布的分布函数定义如下:
P(m, k) = mk * e-m/k! (k = 0, 1, 2, 3, …)
对于给定的m和k (0<m<2000, 0<= k < 2500),计算其概率,以科学格式输出,保留小数点后6位有效数字。
可以使用数学库函数,误差不超过0.000001。
【输入形式】
输入文件为当前目录下的poisson.in。 文件中包含两个数字,分别为m,k的值。
【输出形式】
输出文件为当前目录下的poisson.out。 文件中输出泊松分布的值,值以科学格式输出,保留小数点后6位有效数字。
【输入样例】
1 0
【输出样例】
3.678794e-01
【时间限制】
1s
【空间限制】
65536KB
【上传文件】
上传c语言源程序,文件名为poisson.c。
源程序
//by yin
#include "stdlib.h"
#include "stdio.h"
void getValue(double* v1,int* exp1){
double v=*v1;
int exp=0;
double t=v>=1?0.1:10;
int i;
for(i=0;v>=10||v<1;i++){
v*=t;
}
exp=t==10?-i:i;
*v1=v;
*exp1=exp;
}
void merge(double* v,int* exp,double v1,int exp1){
double value=(*v)*v1;
int exp0;
getValue(&value,&exp0);
*exp=*exp+exp1+exp0;
*v=value;
}
void print(double v,int exp,FILE* out){
fprintf(out,"%.6lf",v);
fputc('e',out);
if(abs(exp)==0)
fprintf(out,"0");
else if(abs(exp)<=9){
if(exp<0)fprintf(out,"-0");
else fprintf(out,"0");
}
else if(abs(exp)<=99){
if(exp<0)fprintf(out,"-0");
else fprintf(out,"0");
}
fprintf(out,"%d",abs(exp));
}
int main(){
FILE* input,* output;
input = fopen("poisson.in","r");
output = fopen("poisson.out","w");
int m,k,n,i;
fscanf(input,"%d %d",&m,&k);
double value=0.0;
double v=1.000,v1;
int exp=0,exp1=0;
n=k;
while(n>0){
v1=((double)m)/((double)n);
n--;
// printf("%lf %d--%lf %d\n",v1,n+1,v,exp);
getValue(&v1,&exp1);
//printf("getv\n");
merge(&v,&exp,v1,exp1);
//printf("MERGE\n");
}
v1=3.6787944117;
exp1=-1;
for(i=1;i<=m;i++){
merge(&v,&exp,v1,exp1);
}
print(v,exp,output);
fclose(input);
fclose(output);
}