btvn.vn
Tìm kiếm Đăng nhập

Đổi số tự nhiên sang nhị phân

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Đệ quy · Chọn bài khác

Chữ số cuối là số dư khi chia cho 2

Xét số nguyên n≥0. Với n≥2, số dư n%2 là chữ số cuối của biểu diễn nhị phân; phần đầu là biểu diễn của thương n//2. Vì thương nhỏ hơn n, có thể tính phần đầu bằng đệ quy rồi ghép số dư vào bên phải. Với n=13, chia lấy thương và dư cho bảng: | n | n//2 | n%2 | |---|---|---| | 13 | 6 | 1 | | 6 | 3 | 0 | | 3 | 1 | 1 | | 1 | 0 | 1 | Đọc cột dư từ dưới lên được 1101. Cột dư từ trên xuống chưa phải thứ tự các chữ số của kết quả.

Dừng riêng ở số 0 và số 1

```python def binary(n): if n == 0: return '0' if n == 1: return '1' return binary(n // 2) + str(n % 2) ``` Hàm nhận số nguyên không âm và trả xâu không có số 0 thừa ở đầu. Với n=13, các lời gọi đi qua 13,6,3,1; cơ sở trả `'1'`, rồi các bước ghép tạo `'11'`, `'110'`, `'1101'`. Hàm dừng tại n=1, tương ứng chữ số đầu trong bảng. Nếu đầu vào ban đầu là 0 thì trả `'0'`. str(n%2) đổi số dư thành kí tự để nối với xâu phần đầu. Không cộng trực tiếp một số nguyên vào xâu.

Đầu ra là danh sách thì ghép danh sách

```python def binary_list(n): if n == 0: return [0] if n == 1: return [1] return binary_list(n // 2) + [n % 2] ``` Với 13, kết quả là [1,1,0,1]. Phần `[n%2]` là danh sách một phần tử, nên phép + ghép hai danh sách. Với 0, hàm trả [0], biểu diễn một chữ số 0; không trả [] vì đó là không có chữ số nào.

Bỏ một cơ sở có thể làm đổi dạng kết quả

Nếu bỏ nhánh n==1 nhưng giữ n==0 trả `'0'`, lời gọi với n=2 đi qua 2,1,0 rồi ghép thành `'010'`. Xâu ấy vẫn có giá trị nhị phân bằng 2, nhưng có số 0 thừa ở đầu so với dạng `'10'` đang yêu cầu. Nếu đổi cơ sở n==0 thành xâu rỗng thì các số dương có thể được ghép đúng dạng, nhưng riêng đầu vào 0 lại nhận xâu rỗng. Hai cơ sở 0 và 1 ở bản đang dùng xử lí thống nhất cả trường hợp 0 lẫn số dương.

Bài luyện

Hàm binary trong bài trả kết quả nào khi n=13?
Chọn một đáp án

Bài luyện

Vì sao bản binary cần str(n%2), còn binary_list cần [n%2]?
Chọn một đáp án

Bài luyện

Với đầu vào 0, cặp kết quả của binary và binary_list trong bài là gì?
Chọn một đáp án

Bài luyện

Bỏ nhánh n==1 của binary nhưng giữ n==0 trả '0'. Với n=2, kết luận nào đúng?
Chọn một đáp án

Đang học