Giả sử chúng ta có một số N, chúng ta phải tìm một số dương M sao cho gcd (N ^ M, N&M) lớn nhất có thể và m
Vì vậy, nếu đầu vào là 20, thì đầu ra sẽ là 31
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
from math import gcd, sqrt
def bit_count(n):
if (n == 0):
return 0
else:
return (((n & 1) == 0) + bit_count(n >> 1))
def maximum_gcd(n):
if (bit_count(n) == 0):
for i in range(2, int(sqrt(n)) + 1):
if (n % i == 0):
return int(n / i)
else:
val = 0
p = 1
dupn = n
while (n):
if ((n & 1) == 0):
val += p
p = p * 2
n = n >> 1
return gcd(val ^ dupn, val & dupn)
return 1
n = 20
print(maximum_gcd(n))
Đầu vào
20
Đầu ra
31