Quay lại danh sách thử thách
Dễ 0 đã giải Tỷ lệ chấp nhận 0%

Ước số chung lớn nhất

Tìm số lớn nhất chia hết cho cả hai giá trị.

Bạn sẽ học được gì

  • Áp dụng thuật toán Euclid với số dư
  • Biến một quy tắc toán học thành vòng lặp
  • Hiểu vì sao thuật toán chạy nhanh

Đề bài

Xem bản gốc (English)

Trả về ước số chung lớn nhất của a và b. Thuật toán Euclid lặp lại việc thay thế (a, b) bằng (b, a mod b) cho đến khi b bằng 0.

Cài đặt hàm gcd(a, b).

Đầu vào

a: Số thứ nhất. b: Số thứ hai.

Đầu ra

Trả về gcd(a, b). gcd(0, 0) là 0.

Ràng buộc

0 ≤ a, b ≤ 10¹⁸

Ví dụ

Ví dụ 1
Đầu vào:
a = 48
b = 18

Kết quả mong đợi:
expected = 6
Đầu vào:
long long a = 48;
long long b = 18;

Kết quả mong đợi:
long long expected = 6;
Đầu vào:
long a = 48;
long b = 18;

Kết quả mong đợi:
long expected = 6;

Giải thích

48 mod 18 = 12, 18 mod 12 = 6, 12 mod 6 = 0, nên kết quả là 6.

Ví dụ 2
Đầu vào:
a = 17
b = 5

Kết quả mong đợi:
expected = 1
Đầu vào:
long long a = 17;
long long b = 5;

Kết quả mong đợi:
long long expected = 1;
Đầu vào:
long a = 17;
long b = 5;

Kết quả mong đợi:
long expected = 1;

Giải thích

17 và 5 không có ước chung nào ngoài 1.

Hướng tiếp cận

Hãy tự thử trước, sau đó mở từng gợi ý một.

Gợi ý 1

gcd không đổi khi bạn thay một cặp bằng bước lấy phần dư.

Gợi ý 2

Tiếp tục đổi vai trò của hai số cho đến khi số thứ hai bằng 0.

Gợi ý 3

Nhớ xử lý trường hợp cả hai đầu vào đều bằng 0.

Độ phức tạp mong đợi

thời gian O(log min(a, b)), bộ nhớ phụ O(1)

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.