HDU—— 1099 Lottery

题意:Eddy的公司出了一种彩票,该彩票为一个系列,每个系列有N张且编号为1~N,当收集齐所有彩票后就能得到一种奖品,问平均需要买多少张才能集齐每个系列的N张彩票?ps:读题读的蛋疼,理解起来也很费劲。

解题思路:首先不管你买多少张,肯定能买中N张中的任意一张概率为N/N,接着能买中剩下N-1张当中的任意一张的概率为N-1/N,依次类推N-2/N、N-3/N......1/N,对每次的概率求倒数就是每买中一张彩票需要的平均彩票数,然后将所有倒数相加得:N(1+1/2+1/3+......+1/N-1+1/N),然后就是对该式子进行求解,详见代码。

Code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;

LL FenMu[25],FenZi[25];
LL gcd(LL x,LL y)
{
    return y==0 ? x:gcd(y,x%y);
}

int main()
{
    //freopen("input.txt","r",stdin);
    FenMu[1] = 1,FenZi[1] = 1;
    for(LL j = 2; j <= 22; j++)//采用递推思想,第i位的分母值是数值i与i-1位置的分母值的最小公倍数
    {
        FenMu[j] = j*FenMu[j-1]/gcd(j,FenMu[j-1]);//两个数的最小公倍数等于两个数的乘积除以两个数的最大公约数
        FenZi[j] = FenMu[j]/j+FenMu[j]/FenMu[j-1]*FenZi[j-1];//i位置的分子值FenZi[i]等于本位分子值FenMu[i]/i
    }//加上前一位分子值FenMu[i]/FenMu[i-1]*FenZi[i-1]
    LL N;
    while(~scanf("%I64d",&N))
    {
        int len1 = 0,len2 = 0,len3 = 0;
        if(N*FenZi[N]%FenMu[N] == 0) printf("%I64d\n",N*FenZi[N]/FenMu[N]);
        else
        {
           LL inter = N*FenZi[N]/FenMu[N];
           LL FZ = N*FenZi[N]%FenMu[N], FM = FenMu[N];
           LL factor = gcd(FZ,FM);//分数部分要化简
           FZ /=factor, FM /=factor;//化简
           LL n1 = inter, n2 = FM;
           while(n1) {len1++; n1 /=10;}
           while(n2) {len2++; n2 /=10;}
           for(int i = 0; i <= len1; i++) printf(" ");//输出格式处理
           printf("%I64d\n",FZ); printf("%I64d ",inter);//整数部分与分数部分要有一个空格
           for(int j = 0; j < len2; j++) printf("-"); printf("\n");
           for(int k = 0; k <= len1; k++) printf(" "); printf("%I64d\n",FM);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值