Hướng dẫn giải của F03: Hiệu hai phân số


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Hướng dẫn giải

Cho hai phân số a/b và c/d, cần tìm phân số tối giản của hiệu a/b - c/d. Nếu kết quả âm thì dấu trừ ghi ở tử số.

Cách làm

Quy đồng: a/b - c/d = (ad - cb) / (b*d). Tử số có thể âm nên ta lấy giá trị tuyệt đối của tử để tìm ước chung lớn nhất, còn dấu của tử được giữ nguyên khi chia. Nhớ dùng long long vì tích có thể lớn. Nếu tử bằng 0 thì kết quả là 0/1.

#include <bits/stdc++.h>
using namespace std;

// Tìm ước chung lớn nhất bằng thuật toán Euclid
long long gcd_so(long long x, long long y) {
    while (y != 0) {
        long long r = x % y;
        x = y;
        y = r;
    }
    return x;
}

int main() {
    long long a, b, c, d;
    cin >> a >> b;
    cin >> c >> d;
    // a/b - c/d = (a*d - c*b) / (b*d)
    // Dùng long long vì tích có thể lên tới 10^12
    long long tu = a * d - c * b;
    long long mau = b * d;
    // Lấy trị tuyệt đối của tử để tìm ước chung
    long long tuyetdoi = tu;
    if (tuyetdoi < 0) {
        tuyetdoi = -tuyetdoi;
    }
    long long g = gcd_so(tuyetdoi, mau);
    tu = tu / g;
    mau = mau / g;
    cout << tu << "/" << mau << "\n";
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.