求大神给指教一下 急
给看看为啥100 5 不对啊逃课
时间限制:1000 ms | 内存限制:65536 KB
描述
在一个星期三的早上,某同学想用扔硬币的方式来决定是否要去上算法课。
他扔 n 次硬币,如果当中有连续 m 次以上(含 m 次)的结果都是正面,那么他就去上课,否则就接着睡觉。(假设每次扔硬币扔出的正反两面的概率都是 0.5。)
输入
输入的每行有一组数据,分别为 n 和 m (0 < n <= 2000, 0 < m <= 10)。输入以 0 0 结尾。
输出
对于每组数据,输出他去上课的概率,四舍五入保留小数点后 2 位。
样例输入1 1
2 1
5 5
100 5
2000 5
2 3
0 0样例输出0.50
0.75
0.03
0.81
1.00
0.00
#include <stdio.h>
int c(int n,int m)//求组合数的c(n,m)
{
int i,r;
if(n-m<m)
m=n-m;
for(r=i=1;i<=m;r/=i++)
r*=n--;
return r;
}
int dg(int n)//求阶乘的k!
{
int i,b=1;
for(i=1;i<=n;i++)
b*=i;
return b;
}
int main()
{
int n,m,j,i;
while(scanf("%d %d",&n,&m),n&&m)
{
double p=0.0,sum=0.0,a=1.0;
if(n<m)
{
p=1.00;
printf("%.2f\n",p);
}
else
{
if(n/m<5)
{
for(j=m;j<=n;j++)
sum+=c(n,j);
for(j=0;j<n;j++)
a*=0.5;
p=sum*a;
printf("%.2f\n",p);
}
else
{
/*for(j=m-1;j>0;j--)
sum+=c(n,j);
for(j=0;j<n;j++)
a*=0.5;
p=1.0-a*sum;
printf("%.2f\n",p);*/
//泊松分布
double lat=n*0.5;
double e = 2.718281828459 ;
for(i=1;i<=lat-1;i++)
e*=e;
for(i=m;i>0;i--)
sum+=1.0/dg(i);
for(i=1;i<=m-1;i++)
lat*=lat;
p=1.0-sum*1.0/e*lat;
printf("%.2f\n",p);
}
}
}
return 0;
}