C4-16 · Rút gọn phân số

Xem dạng PDF

Gửi bài giải

Điểm: 1,00
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
Sách "Lập trình cơ sở với Python"
Dạng bài
Ngôn ngữ cho phép
Python

Đề

Có T bộ test, mỗi bộ là một phân số tu/mau (tử và mẫu là số nguyên, mẫu khác 0, cả hai có thể âm). Với mỗi bộ, in phân số tối giản bằng nó theo quy tắc:

  • mẫu luôn dương; nếu phân số âm thì dấu - đặt ở tử;
  • nếu mẫu (sau khi rút gọn) bằng 1 thì chỉ in tử;
  • ngược lại in dạng tu/mau (không có dấu cách).

Gợi ý: chia cả tử và mẫu cho ƯCLN của abs(tu) và abs(mau) (thuật toán Euclid, mục 4.6.2), rồi xử lý dấu.

Dữ liệu vào

  • Dòng đầu: số nguyên T.
  • T dòng tiếp theo, mỗi dòng hai số nguyên tu mau cách nhau một dấu cách.

Kết quả

T dòng, dòng thứ i là phân số tối giản của bộ thứ i.

Ràng buộc

  • 1 ≤ T ≤ 1000.
  • −10⁹ ≤ tu, mau ≤ 10⁹; mau ≠ 0.

Ví dụ

Dữ liệu vào:

2
84 -36
-10 -5

Kết quả:

-7/3
2

Giải thích ví dụ

  • Bộ 1: ƯCLN(84, 36) = 12, nên 84/−36 = 7/−3. Mẫu âm → đổi dấu cả tử và mẫu: −7/3.
  • Bộ 2: ƯCLN(10, 5) = 5, nên −10/−5 = −2/−1 → đổi dấu: 2/1. Mẫu bằng 1 → chỉ in 2.

Với tử bằng 0 (ví dụ 0 -7): ƯCLN(0, 7) = 7, phân số là 0/1 → in 0.

Ghi chú

  • Có test với tử, mẫu cỡ 10⁹ nguyên tố cùng nhau: tìm ƯCLN bằng cách thử từng ước sẽ quá thời gian; hãy dùng Euclid.
  • Dùng // khi chia cho ƯCLN; dùng / sẽ ra số thực (-7.0/3.0).

Nguồn trong sách: Bài C4-16, mục 4.10, giáo trình Lập trình cơ sở với Python — TS. Nguyễn Quốc Long · Mức: (****)


Đang tải...