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; }
浙公网安备 33010602011771号