Để tìm độ cứng kỹ thuật số của một số nguyên, lấy biểu diễn nhị phân của nó và đếm số lần cả dẫn và theo dõi
1
có thể được loại bỏ cho đến khi bắt đầu hoặc kết thúc bằng a0
. Tổng số bit bị loại bỏ là độ cứng kỹ thuật số của nó.
Đó là một lời giải thích khá dài dòng - vì vậy hãy phá vỡ nó bằng một ví dụ hoạt động.
Trong ví dụ này, chúng tôi sẽ sử dụng số 3167. Trong nhị phân, đây là:
110001011111
(Lưu ý rằng, trong quá trình chuyển đổi thành nhị phân, bạn nên đảm bảo loại bỏ các số 0 đứng đầu)
Nó không bắt đầu hoặc kết thúc 0
, vì vậy chúng tôi xóa 1 cặp bit:
1 1000101111 1
Và một cái khác:
11 00010111 11
Nhưng bây giờ có 0 ở đầu, vì vậy chúng tôi không thể xóa 1
các cặp nữa . Tổng cộng, 4 bit chúng tôi đã loại bỏ và 4 là độ cứng kỹ thuật số 3167.
Tuy nhiên, đối với các số có thể được viết là 2 n -1 cho n dương (nghĩa là chỉ chứa 1
trong biểu diễn nhị phân), sẽ không bao giờ đạt được 0 và vì vậy tất cả các bit có thể bị xóa. Điều này có nghĩa là độ cứng chỉ đơn giản là độ dài bit của tích phân.
Các thách thức
Nhiệm vụ của bạn là viết một chương trình hoặc hàm, với một số nguyên không âm n >= 0
, xác định độ cứng kỹ thuật số của nó.
Bạn có thể gửi một chương trình đầy đủ thực hiện I / O hoặc một hàm trả về kết quả. Việc gửi của bạn phải hoạt động đối với các giá trị n
trong phạm vi số nguyên tiêu chuẩn của ngôn ngữ của bạn.
Các trường hợp thử nghiệm
Vui lòng thông báo cho tôi nếu bất kỳ điều nào trong số này không chính xác hoặc nếu bạn muốn đề xuất bất kỳ trường hợp cạnh nào cần thêm.
0 -> 0
1 -> 1
8 -> 0
23 -> 2
31 -> 5
103 -> 4
127 -> 7
1877 -> 2
2015 -> 10
Đây là giải pháp Python không được sử dụng mà tôi đã sử dụng để tạo các trường hợp thử nghiệm này (không được bảo đảm là không có lỗi):
def hardness(num) -> int:
binary = bin(num)[2:]
if binary.count('0') == 0:
return num.bit_length()
revbin = binary[::-1]
return min(revbin.find('0'), binary.find('0')) * 2
1
trả về 1 khi không có gì0
trong đó? Ý tôi là, bạn không thể xóa đủ 1 giây khỏi chuỗi để bắt đầu hoặc kết thúc0
.