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

Java计算数字各位之和:欧拉问题代码完善咨询

解决欧拉问题16:计算2的1000次方各位数字之和

嘿,很高兴看到你尝试挑战欧拉问题16!咱们先聊聊你当前代码里的核心问题,然后一步步把它修正完成。

你的代码存在的关键问题

  • double类型精度不足:2的1000次方是一个拥有302位的超大整数,而double类型最多只能精确表示到2^53左右的整数,超过这个范围后会丢失精度,而且会自动转为科学计数法(比如1.07e301),这会导致你后续把它转字符串分解数字时完全得不到正确的各位数字。
  • 未完成的循环逻辑:DecomposeNumber方法里的for循环只写了开头,还需要补全遍历逻辑。

修正方案:使用BigInteger处理超大整数

Java提供了java.math.BigInteger类,专门用来处理任意精度的整数,完美适配这种超大数计算场景。下面是修正后的完整代码:

import java.math.BigInteger;

public class Problem16{ 
    public static void main(String[] args){ 
        System.out.println(DecomposeNumber(PowerDigitSum(1000))); 
    }

    public static BigInteger PowerDigitSum(int exponent){ 
        // 使用BigInteger的pow方法计算2的exponent次方,保证精度
        return BigInteger.valueOf(2).pow(exponent); 
    }

    public static int DecomposeNumber(BigInteger number){ 
        // 将BigInteger转为字符串,遍历每个字符转为数字求和
        String numStr = number.toString();
        int sum = 0;
        for(int i = 0; i < numStr.length(); i++){
            // 把字符转为对应的数字:字符'0'的ASCII码是48,减去它就能得到数字值
            sum += numStr.charAt(i) - '0';
        }
        return sum;
    }
}

代码关键部分解释

  1. PowerDigitSum方法:

    • 用BigInteger.valueOf(2)创建一个值为2的BigInteger对象,然后调用pow(exponent)方法计算2的指定次方,这样得到的结果是完全精确的超大整数。
    • 把参数类型从double改为int,因为指数是整数,用int更合理。
  2. DecomposeNumber方法:

    • 参数类型改为BigInteger,接收精确的超大整数。
    • 把BigInteger转为字符串后,直接遍历每个字符,通过字符 - '0'的方式快速将字符转为对应的整数(比如'5'-'0'=5),累加求和即可。

小测试验证

你可以先测试小的指数来验证代码是否正确:比如2^10=1024,各位数字之和是1+0+2+4=7,调用PowerDigitSum(10)再传入DecomposeNumber,应该返回7,这样能确保逻辑没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:15:24