C5-09 · Rút gọn phân số
Xem dạng PDFĐề
Viết hàm rut_gon(tu, mau) trả về hai giá trị: tử và mẫu của phân số ~\dfrac{tu}{mau}~ sau khi đã chia cả hai cho ước chung lớn nhất của chúng, tính bằng hàm ucln ở mục 5.5.2. Kiểm thử dạng
assert rut_gon(36, 48) == (3, 4)
Chương trình chính đọc tử và mẫu, nhận hai giá trị trả về bằng gán đồng thời (mục 5.3.1) và in phân số tối giản dạng tu/mau, kể cả khi mẫu là 1 (4 2 → 2/1).
Dữ liệu vào
Một dòng chứa hai số nguyên dương: tử số và mẫu số, cách nhau một dấu cách.
Kết quả
Một dòng dạng tu/mau: hai số nguyên dương, ở giữa là dấu /, không có dấu cách.
Ràng buộc
- ~1 \le tu, mau \le 10^{18}~.
Ví dụ
Dữ liệu vào:
36 48
Kết quả:
3/4
Giải thích ví dụ
ƯCLN(36, 48) = 12, nên ~\dfrac{36}{48} = \dfrac{36 : 12}{48 : 12} = \dfrac{3}{4}~. Hàm trả về bộ hai giá trị (3, 4); chương trình chính viết tu, mau = rut_gon(36, 48) rồi in 3/4.
Thêm một ví dụ trong lời đề: 4 2 → ƯCLN = 2 → 2/1 (vẫn in mẫu 1).
Ghi chú
print(rut_gon(36, 48))in(3, 4)(một bộ – tuple), không phải3/4. Cònprint(tu, "/", mau)in3 / 4vìsepmặc định là dấu cách; dùng f-stringf"{tu}/{mau}"hoặcsep="/".- Dùng chia nguyên
//. Chia thực/in3.0/4.0; cònint(tu / g)thì sai với số lớn vì số thực chỉ giữ khoảng 15–16 chữ số. - Thử chia lần lượt cho 2, 3, 4, … vẫn đúng với số nhỏ nhưng quá chậm với số cỡ ~10^{18}~: bị Time Limit. Thuật toán Euclid chỉ cần vài chục vòng.
- Hệ thống chỉ so kết quả in ra; yêu cầu "hàm trả về hai giá trị, dùng
uclncủa mục 5.5.2, có ít nhất baassert" là phần giảng viên kiểm khi chấm tay.
Nguồn trong sách: Bài C5-09, mục 5.10, giáo trình "Lập trình cơ sở với Python" — TS. Nguyễn Quốc Long · Mức: (***)