看看对不?
令 n - 2^x = m * 2^(x+1),
则n = (2m + 1) * 2^x,右侧是一个奇数,乘以2的幂。
1、若n为奇数,则必须有x = 0。此时n = 2m + 1,符合。
2、若n为偶数,再细分一下:
2.1 若n包含奇数值的因子,则奇数因子必为(2m+1)。
2.2 若n不包含奇数值的因子,则全部因子必须为2,即n为2的幂。
也就是对于情况2,不停将n除以2,看除法的结果就知道了m和x的具体取值了。
除到最后如果商是1,则m = 0。 x是除以2的次数。
除到最后如果商是个1之外的奇数,则m也能求出来。x是除以2的次数。
//除以2改为右移。
void solve(int n, int &m, int &x) {
printf("solved: n = %d, ", n);
if ((n & 1) == 1) {
x = 0;
m = (n - 1) / 2;
} else {
x = 0;
do {
n /= 2;
x++;
} while ((n & 1) == 0);
m = (n - 1) / 2;
}
printf("x = %d\n", x);
}
int main() {
int x, m;
for (int n = 1; n <= 8; ++n)
solve(n, m, x);
结论就是: x是n的二进制表示的第一个非0的bit位的位编号(从低位开始编号)。
--
修改:z16166 FROM 114.245.195.*
FROM 114.245.195.*