Đề bài
Liên tục chia n cho 2, bỏ phần dư (chia lấy phần nguyên), cho đến khi kết quả là 1. Đếm số lần chia như vậy.
Cài đặt hàm halve_until_one(n).
Đầu vào
n: Một số nguyên dương.
Đầu ra
Trả về số lần chia.
Ràng buộc
1 ≤ n ≤ 1.000.000.000.000
Ví dụ
Đầu vào:
n = 20
Kết quả mong đợi:
expected = 4
Đầu vào:
long long n = 20;
Kết quả mong đợi:
long long expected = 4;
Đầu vào:
long n = 20;
Kết quả mong đợi:
long expected = 4;
Giải thích
20 → 10 → 5 → 2 → 1 cần 4 lần chia.
Đầu vào:
n = 1
Kết quả mong đợi:
expected = 0
Đầu vào:
long long n = 1;
Kết quả mong đợi:
long long expected = 0;
Đầu vào:
long n = 1;
Kết quả mong đợi:
long expected = 0;
Giải thích
n đã là 1 nên không cần chia lần nào.
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Đếm xem bạn có thể giảm số bao nhiêu lần bằng cách chia cho 2 trước khi nó thành 1.
Gợi ý 2
Chỉ cần chia nguyên lặp lại; không cần theo dõi phần dư bị bỏ đi.
Gợi ý 3
Đảm bảo dừng đúng khi giá trị chạm 1, không phải khi nó về 0.
Độ phức tạp mong đợi
thời gian O(log n), 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.