1 条题解

  • 0
    @ 2026-6-19 10:30:46

    📝 题目大意

    给定正整数 NN,求其二进制表示末尾连续 00 的个数(即 ctz(N)\text{ctz}(N),Count Trailing Zeros)。

    💡 解题思路

    1. 题目分析:二进制末尾连续 00 的个数,本质上等价于 NN 能被 22 整除多少次——因为每次除以 22 相当于右移一位,去掉末尾的一个 00。当 NN 变为奇数时(即末尾为 11),不再能整除 22,统计结束。

    2. 算法推导:维护计数器 count = 0,只要 Nmod2=0N \bmod 2 = 0(即 NN 为偶数),就让 count11 并将 NN 除以 22。循环结束时 count 即为答案。该算法直接模拟了反复去掉末尾 00 的过程,与 ctz\text{ctz} 的定义完全一致。

    3. 边界与细节

      • NN 最小为 11,其二进制为 1,末尾无 00,循环体不执行,输出 00,正确。
      • NN 最大为 10910^9,远小于 int 上限(约 2.1×1092.1 \times 10^9),无溢出风险。
      • 注意题目要求的是末尾连续 00,而非二进制表示中全部 00 的个数——样例 1818(二进制 10010)输出 11 而非 33,正是这个原因。

    ⏱️ 复杂度分析

    • 时间复杂度:每次循环 NN 至少减半,最多执行 log2N\log_2 N 次。N109N \leq 10^9 时最多约 3030 次,故为 O(logN)O(\log N)
    • 空间复杂度:仅使用常数个变量 Ncount,为 O(1)O(1)

    💻 标准代码 (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
    上传者