1 条题解
-
0
📝 题目大意
给定正整数 ,求其二进制表示末尾连续 的个数(即 ,Count Trailing Zeros)。
💡 解题思路
-
题目分析:二进制末尾连续 的个数,本质上等价于 能被 整除多少次——因为每次除以 相当于右移一位,去掉末尾的一个 。当 变为奇数时(即末尾为 ),不再能整除 ,统计结束。
-
算法推导:维护计数器
count = 0,只要 (即 为偶数),就让count加 并将 除以 。循环结束时count即为答案。该算法直接模拟了反复去掉末尾 的过程,与 的定义完全一致。 -
边界与细节:
- 最小为 ,其二进制为
1,末尾无 ,循环体不执行,输出 ,正确。 - 最大为 ,远小于
int上限(约 ),无溢出风险。 - 注意题目要求的是末尾连续 ,而非二进制表示中全部 的个数——样例 (二进制
10010)输出 而非 ,正是这个原因。
- 最小为 ,其二进制为
⏱️ 复杂度分析
- 时间复杂度:每次循环 至少减半,最多执行 次。 时最多约 次,故为 。
- 空间复杂度:仅使用常数个变量
N和count,为 。
💻 标准代码 (C++)
#include <iostream> using namespace std; int main() { int N; cin >> N; int count = 0; // 统计末尾连续 0 的个数 while (N % 2 == 0) { // 只要 N 是偶数,说明末尾还有 0 count++; // 统计一个 0 N /= 2; // 去掉末尾的 0(右移一位) } cout << count << endl; // 输出结果 return 0; } -
- 1
信息
- ID
- 767
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者