C5-09 · 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

Đề

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ải 3/4. Còn print(tu, "/", mau) in 3 / 4 vì sep mặc định là dấu cách; dùng f-string f"{tu}/{mau}" hoặc sep="/".
  • Dùng chia nguyên //. Chia thực / in 3.0/4.0; còn int(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 ucln của mục 5.5.2, có ít nhất ba assert" 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: (***)


Đang tải...