lottery概率问题

时间:2022-01-02 11:46:08

问题:1~n编号的彩票,要买全,等概率条件下平均要买几张要求写出算法。

回答:已经买了m张时,买中剩下的概率为1-m/n,则要买的张数为1/(1-m/n)
n=2,s=1+1/(1-1/2);n=3,s=1+1/(1-1/3)+1/(1-2/3)
s=1+1/(1-1/n)+1/(1-2/n)+1/(1-3/n)+……+1/(1-(n-1)/n)=n/n+n/(n-1)+n/(n-2)+……+n/1=sum(n/i),i=1~n
b/a+d/c=(bc+ad)/(ac),本题的本质是要解决n/1+n/2+n/3+----+n/n!,可以先利用同分的思想,即最小公倍数求出所有的的分母的最小公倍数!然后进行分数的求和!注意分子和分母的没有相除之前需要注意范围超过了整形。

#include <iostream>  
using namespace std;  
      
    _int64 gcd(_int64 a,_int64 b)  
    {  
        if(b==0) return a;  
        else return gcd(b,a%b);  
    }  
      
    int main()  
    {  
      
        int i,n,size1,size2;  
        _int64 number,n1,n2;  
        _int64 integer;//整数部分  
        _int64 fenzi;//分子  
        _int64 fenmu;//分母  
        _int64 a[23];//a[n]表示输入为n时,从1到n这些数的最小公倍数  
      
        a[1]=1;  
        for(i=2;i<=22;i++) a[i]=i*a[i-1]/gcd(i,a[i-1]);//两个数的最小公倍数等于这两个数的乘机除以他们的最大公约数  
      
        while(cin>>n)  
        {  
            fenzi=0;  
            for(i=1;i<=n;i++) fenzi += a[n]/i;              
            fenzi *= n;  
            number = gcd(fenzi,a[n]); //分子分母的最大公约数  
            fenzi = fenzi/number; //约分后的分子  
            fenmu = a[n]/number; //约分后的分母  
            integer = fenzi/fenmu; //结果的整数部分  
            fenzi = fenzi-integer*fenmu; //最终结果的分子  
      
            if(fenzi==0) { printf("%I64d\n",integer); continue; }  
      
            size1=size2=0; //size1,size2分别为整数部分的位数和分子的位数  
            n1=integer; n2=fenmu;  
            while(n1!=0) { size1++; n1/=10; }  
            while(n2!=0) { size2++; n2/=10; }  
      
            //按题目要求的格式打印结果  
            for(i=0;i<=size1;i++) printf(" ");  
            printf("%I64d\n",fenzi);  
            printf("%I64d ",integer);  
            for(i=0;i<size2;i++) printf("-");  
            printf("\n");  
            for(i=0;i<=size1;i++) printf(" ");  
            printf("%I64d\n",fenmu);  
        }  
        return 1;  
    }