HDU 1099 [Lottery] 数学期望

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1099

题目大意:一套卡片有n张,每次购买随机获得一张卡片,问集齐一套卡片的期望次数是多少?

关键思想:知道此处期望是概率的倒数即可,比如有5张卡片,

第一步你获得想要卡片的概率是1,倒数为1;

第二步你获得想要卡片的概率是4/5,倒数为5/4;

第三步你获得想要卡片的概率是3/5,倒数为5/3;

……累加即为结果,格式输出有些坑爹,耐心就好。

代码如下:

#include <iostream>
using namespace std;

typedef long long ll;

ll GCD(ll a,ll b){
    if(a==0||b==0)return 1; 
    return a%b==0?b:GCD(b,a%b);
}

int digits(ll n){
    int d=0;
    while(n){
        n/=10;
        d++;
    }
    return d;
}

int main(){
    int n;
    ll num,deno,inte;//分子分母整数部分 
    while(scanf("%d",&n)!=EOF){
        num=0,deno=1,inte=1;
        for(int i=1;i<=n-1;i++){ 
            num=num*i+deno*n;
            deno=deno*i;
            
            ll gcd=GCD(num,deno);//约分 
            num/=gcd;
            deno/=gcd; 
        } 
        inte+=num/deno;//整数部分 
        num=num%deno;//分数部分 
        if(num==0)printf("%lld\n",inte);//若能整除 
        else{//格式化输出 
            for(int i=0;i<=digits(inte);i++)printf(" "); 
            printf("%lld\n",num);
            printf("%lld ",inte);
            for(int i=0;i<digits(deno);i++)printf("-");
            printf("\n");
            for(int i=0;i<=digits(inte);i++)printf(" ");
            printf("%lld\n",deno);
        }

    }
    return 0;
}

 

    原文作者:哇咔咔咔
    原文地址: https://www.cnblogs.com/G-M-WuJieMatrix/p/7400401.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞