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; }
边完善自己边认识自己