假设我们有一个数字N,我们必须找到一个正数M,以使gcd(N ^ M,N&M)尽可能大并且m <n。我们还将返回由此获得的最大gcd。
因此,如果输入为20,则输出为31
为了解决这个问题,我们将遵循以下步骤-
如果bit_count(n)与0相同,则
如果n mod i等于0,则
返回int(n / i)
对于范围2到int((n)的平方根)+1的i,执行
除此以外,
如果(n AND 1)等于0,则
p:= p * 2
n:= n >> 1
值:=值+ p
值:= 0
p:=
杜邦:= n
当n不为零时,
返回gcd(val XOR dupn,val AND dupn)
返回1
让我们看下面的实现以更好地理解-
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))
20
输出结果
31