UVa10288 Coupons 分数模版

UVa10288

题目非常简单, 答案就是 n/n+n/(n-1)+...+n/1;

要求分数输出。套用分数模板。。

#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
", numerator);  
        else {  
            long long num = numerator/denominator;  
            long long tmp = num;  
            int len = 0;  
            while (tmp) {  
                len++;  
                tmp/=10;  
            }  
  
            for (int i = 0; i < len; i++) printf(" ");  
            if (len != 0) printf(" ");  
            printf("%lld
",numerator%denominator);  
  
            if (num != 0) printf("%lld ", num);  
            tmp = denominator;  
            while (tmp) {  
                printf("-");  
                tmp/=10;  
            }  
            puts("");  
  
            for (int i = 0; i < len; i++) printf(" ");  
            if (len != 0) printf(" ");  
            printf("%lld
",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;  
}  

  

原文地址:https://www.cnblogs.com/heisenberg-/p/6857960.html