在 Python 中查找正数 M,使得 gcd(N^M, N&M) 最大
假设我们有一个数字 N,我们必须找到一个正数 M,使得 gcd(N^M, N&M) 尽可能大,并且 m < n。我们还将返回获得的最大 gcd。
因此,如果输入是 20,则输出将是 31
为了解决这个问题,我们将遵循以下步骤:
- 如果 bit_count(n) 等于 0,则
- 对于 i 从 2 到 int(n 的平方根) + 1,执行以下操作:
- 如果 n mod i 等于 0,则
- 返回 int(n / i)
- 如果 n mod i 等于 0,则
- 对于 i 从 2 到 int(n 的平方根) + 1,执行以下操作:
- 否则,
- val := 0
- p :=
- dupn := n
- 当 n 不为零时,执行以下操作:
- 如果 (n AND 1) 等于 0,则
- val := val + p
- p := p * 2
- n := n >> 1
- 如果 (n AND 1) 等于 0,则
- 返回 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
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP