uva 10288 Coupons (分数模板)

https://vjudge.net/problem/UVA-10288

大街上到处在卖彩票,一元钱一张。购买撕开它上面的锡箔,你会看到一个漂亮的图案。

图案有n种,如果你收集到所有n(n≤33)种彩票,就可以得大奖。

请问,在平均情况下,需要买多少张彩票才能得到大奖呢?

答案以带分数形式输出

 

例:当n=5时

思路简单,就是输出麻烦

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=500;
struct fraction
{
    long long numerator;
    long long denominator;
    fraction()
    {
        numerator=0;
        denominator=1;
    }
    fraction(long long num)
    {
        numerator=num;
        denominator=1;
    }
    fraction(long long a,long long b)
    {
        numerator=a;
        denominator=b;
        this->reduction();
    }
    void operator =(const long long num)
    {
        numerator=num;
        denominator=1;
        this->reduction();
    }
    void operator=(const fraction b)
    {
        numerator=b.numerator;
        denominator=b.denominator;
        this->reduction();
    }
    fraction operator + (const fraction b)const
    {
        long long gcdnum=__gcd(denominator,b.denominator);
        fraction tmp=fraction(numerator*(b.denominator/gcdnum)+b.numerator*(denominator/gcdnum),denominator/gcdnum*b.denominator);
        tmp.reduction();
        return tmp;
    }
    fraction operator + (const int b)const
    {
        return ((*this)+fraction(b));
    }
    fraction operator - (const fraction b)const
    {
        return ((*this)+fraction(-b.numerator,b.denominator));
    }
    fraction operator - (const int b)const
    {
        return ((*this)-fraction(b));
    }
    fraction operator * (const fraction b)const
    {
        fraction tmp=fraction(numerator*b.numerator,denominator*b.denominator);
        tmp.reduction();
        return tmp;
    }
    fraction operator * (const int b)const
    {
        return ((*this)*fraction(b));
    }
    fraction operator / (const fraction b)const
    {
        return ((*this)*fraction(b.denominator,b.numerator));
    }
    void reduction()
    {
        if(numerator==0)
        {
            denominator=1;
            return;
        }
        long long gcdnum=__gcd(numerator,denominator);
        numerator/=gcdnum;
        denominator/=gcdnum;
    }
    void print()
    {
        if(denominator==1) { printf("%lld\n",numerator); }
        else
        {
            long long num=numerator/denominator;
            long long tmp=num;
            int len=0;
            while(tmp)
            {
                len++;
                tmp/=10;
            }
            for(int i=1;i<=len;i++) printf(" ");
            if(len) printf(" ");
            printf("%lld\n",numerator%denominator);
            if(num) printf("%lld ",num);
            tmp=denominator;
            while(tmp)
            {
                printf("-");  tmp/=10;
            }
            puts("");
            for(int i=1;i<=len;i++) printf(" ");
            if(len) printf(" ");
            printf("%lld\n",denominator);
        }
    }
}f[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        f[0]=0;
        for(int i=1;i<=n;i++) 
         f[i]=f[i-1]+fraction(1,i);
        f[n]=f[n]*n;
        f[n].print();
    }
    return 0;
}

 

posted @ 2017-06-04 10:50  TRTTG  阅读(320)  评论(0)    收藏  举报