ZJU PAT 1088

辗转相除法求最大公约数

#include <iostream>
#include <math.h>

using namespace std;

long long greatestCommon(long long a, long long b) {
    if (a == 0 || b == 0) {
        return 1;
    }

    a = abs(a);
    b = abs(b);    

    while (true) {
        if (a < b) {
            long long temp = a;
            a = b;
            b = temp;
        }
        a = a % b;
        if (a == 0) {
            return b;
        }
    }
}

struct Number {
    long long a, b;

    Number(long long ina, long long inb) :a(ina), b(inb) {
        if (b < 0) {
            a = -a;
            b = -b;
        }

        if (a != 0 && b != 0) {
            long long gc = greatestCommon(a, b);

            a = a / gc;
            b = b / gc;
        }
    }

    void print() {
        if (b == 0) {
            printf("Inf");
            return;
        }
        if (a == 0) {
            printf("0");
            return;
        }

        bool positive = a > 0 && b > 0;

        long long aa = abs(a);
        long long bb = abs(b);

        printf(positive ? "" : "(-");

        long long integer = aa / bb;
        long long remain = aa - bb * integer;
        if (integer != 0) {
            printf("%lld", integer);
        }
        if (remain != 0) {
            if (integer != 0) {
                printf(" ");
            }
            printf("%lld/%lld", remain, bb);
        }

        printf(positive ? "" : ")");
    }
};

void print(Number n1, char op, Number n2, Number n3) {
    n1.print();
    printf(" %c ", op);
    n2.print();
    printf(" = ");
    n3.print();
    printf("\n");
}

Number plusNumber(Number n1, Number n2) {
    long long gc = greatestCommon(n1.b, n2.b);
    long long t1 = n2.b / gc;
    long long t2 = n1.b / gc;

    return Number(n1.a * t1 + n2.a * t2, n1.b * t1);
}

int main() {
    long long a1, b1, a2, b2;
    scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
    Number n1(a1, b1);
    Number n2(a2, b2);

    print(n1, '+', n2, plusNumber(n1, n2));
    print(n1, '-', n2, plusNumber(n1, Number(-n2.a, n2.b)));
    print(n1, '*', n2, Number(n1.a * n2.a, n1.b * n2.b));
    print(n1, '/', n2, Number(n1.a * n2.b, n1.b * n2.a));

    return 0;
}

 

posted @ 2014-12-01 15:09  傻喵  阅读(156)  评论(0)    收藏  举报