掷硬币 HUST

来源:互联网 发布:linux 解压缩文件 编辑:程序博客网 时间:2024/05/17 03:36

掷硬币 HUST - 1692


Problem

有一枚特殊硬币,这枚硬币掷出正面的概率为p,反面的概率为1-p。
现在开始掷硬币,直到正反两面均出现过时停下。问掷硬币的期望次数。
输入数据第一行包含一个整数T<=20,表示测试组数,

Input

第一行包含一个 数字T,表明测试数据的组数。
接下来是T行,
每行测试数据包含一个精确到千分位的实数p(0

Output

每组数据输出一行,包含一个整数,表示期望次数四舍五入到整数的值。

Sample Input

1
0.500

Sample Output

3

ps:理解题意很重要

附:期望次数 = ∑掷硬币次数 * 该次数出现的概率(掷硬币次数>=2)

代码如下:

#include<iostream>  #include<cstdio>  #include<string.h>#include<algorithm> #include<cstdlib> #include<cmath>using namespace std; int main() {    int t;    scanf("%d", &t);    while( t-- ) {        double p, fp;        scanf("%lf", &p);        fp = 1.0 - p;         double sum = 0.0, index;        int i = 2;        while(1) {            index = pow(p, i-1) * fp + pow(fp, i-1) * p;            if(index*i < 0.001) break;            sum += i * index;            i++;//          printf("sum == %lf\n", sum);        }        sum = floor(sum+0.5);        printf("%d\n", (int)sum);    }    return 0;}