酷代码 AI
菜单

给你一个正整数 ,输出A的最低数。 例如,给你 A=26,我们可以将A化成二进制为 11010 ,则A 的最低数是 10,输出 10 的十进制为 2。 再例如,给你 A=88,我们可以将A化成二进制为 1011000,则A的最低数是1000,输出为8。 输入 输入包含多组测试样例。每行输入一个正整数 。当输入 0 时,输入结束。 输出 对于每一个输入,输出对应的最低数。 样例输入 复制 26 88 0 样例输出 复制 2 8

要找到A的最低数,需要提取A的二进制表示中从最低位开始连续的1组成的二进制数。 例如: - A=26,二进制11010,最低位开始是0,接着是1,所以连续的1是10(二进制),十进制是2。 - A=88,二进制1011000,最低位开始是三个0,接着是三个1,所以连续的1是1000(二进制),十进制是8。 算法思路: 1. 找到A的二进制中最低位的1的位置(即A & -A,得到最低位1对应的值)。 2. 如果A的最低几位是连续的1,那么最低数就是这些连续的1组成的二进制数。 3. 实际上,最低数就是A的二进制表示中从最低位开始连续的1所对应的二进制数。 可以这样计算: - 令 x = A & -A(得到最低位的1单独的值,比如 26 & -26 = 2)。 - 然后令 y = A + x(这样会进位,使得原来连续的1变成0,并产生一个进位)。 - 最低数 = (A & ~y) / x * 2 ? 更简单的方法: 直接找到A的二进制中从最低位开始连续的1,等价于 (A ^ (A + (A & -A))) / (A & -A) >> 1 ? 其实更简单: 最低数 = (A & -A) * 2 ? 不对,因为连续的1可能不止一位。 实际上,最低数 = (A ^ (A - 1)) & A ? 测试一下: A=26: A-1=25(11001), A^(A-1)=00011(3), 与A=11010得00010(2),正确。 A=88: A-1=87(1010111), A^(A-1)=0001111(15), 与A=1011000得0001000(8),正确。 所以公式是: lowest_number = A & (A ^ (A - 1)) 等价于 A & (~A + 1) & A ? 其实就是 A & -A ? 不对,A&-A只得到最低一位1,但这里要得到连续的1。 仔细看: A ^ (A-1) 得到的是从最低位开始到第一个0位(包括)都是1,其余是0。 例如A=26(11010), A-1=25(11001), 异或得到00011(二进制),即最后两位不同,得到3。 再与A相与,得到00010(二进制),即2。 所以公式是: result = A & (A ^ (A - 1)) 代码实现(C++): ```cpp #include <iostream> using namespace std; int main() { int A; while (cin >> A && A != 0) { int lowest = A & (A ^ (A - 1)); cout << lowest << endl; } return 0; } ``` 测试样例: 输入: 26 88 0 输出: 2 8 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: - 注意A=0时的输入终止条件,避免对0进行计算。 - 使用位运算时确保操作数类型一致,避免符号位干扰。 - 多组测试数据要持续读取直到结束标志,不要提前退出循环。 [2026-01-23 19:40:10 | AI写代码神器 | 775点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多