You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用递归统计正整数中2的因数个数?现有代码存在问题

修复统计正整数中2的因数个数的方法

原代码的核心问题是完全搞错了逻辑——你需要统计的是数字能被2整除的次数,却错误地用了除以3的递归条件,这也是它只对6、12这类恰好和3的倍数巧合匹配的数有效的原因。

递归实现(修正版)

public int twos(int n) {
    // 奇数没有2的因数,直接返回0
    if (n % 2 != 0) {
        return 0;
    }
    // 能被2整除,就递归处理除以2后的数,同时计数+1
    return twos(n / 2) + 1;
}

逻辑说明:每次判断当前数是否为奇数,是则终止递归返回0;否则将数字除以2,递归调用自身并把结果加1——每一次除以2都代表找到一个2的因数,累加后就是总个数。

迭代实现(更稳妥,避免栈溢出)

如果处理极大的数字,递归可能触发栈溢出,用循环更可靠:

public int twos(int n) {
    int count = 0;
    // 只要能被2整除,就持续除以2并计数
    while (n % 2 == 0) {
        count++;
        n = n / 2;
    }
    return count;
}

逻辑说明:初始化计数器为0,循环检查数字是否能被2整除,每次满足条件就把计数器加1,同时将数字除以2;当数字变成奇数时,循环结束,返回最终计数。

测试验证

  • 输入3(奇数)→ 返回0
  • 输入6(2×3)→ 返回1
  • 输入12(2²×3)→ 返回2
  • 输入16(2⁴)→ 返回4
  • 输入18(2×3²)→ 返回1

内容的提问来源于stack exchange,提问作者DC_Fruit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:05:53