Java 数字和问题

Java 数字和问题,java,algorithm,sum-of-digits,Java,Algorithm,Sum Of Digits,我正在做一些Euler项目的问题,我偶然发现了一个问题。 我不知道为什么这个算法不适用于2^1000。它适用于10^1和10^8范围内的数字(这些是我测试的数字),但它应该适用于所有可能的范围 2^1000是1.07*10^301。双精度的上限在10^308左右,因此数字仍在范围内 import java.lang.Math; public class Euler15 { public static void main(String[] args) { int co

我正在做一些Euler项目的问题,我偶然发现了一个问题。 我不知道为什么这个算法不适用于2^1000。它适用于10^1和10^8范围内的数字(这些是我测试的数字),但它应该适用于所有可能的范围

2^1000是1.07*10^301。双精度的上限在10^308左右,因此数字仍在范围内

import java.lang.Math;

public class Euler15 {
    public static void main(String[] args) {


        int count = 0;
        double res = Math.pow(2,1000);

        for(int i = 301; i >= 0; i--){
            if (res == 0){
                break;
            }
            while (res >= Math.pow(10, i)){
                res-= Math.pow(10, i);
                System.out.println(res);
                count++;
            }
        }

    System.out.println(count);
}
}

对于普通的数据类型来说,2^1000是一个很大的挑战。使用BigInteger或字符串

import java.math.BigInteger;
将输入作为BigInteger:

BigInteger n = BigInteger.valueOf(2);
现在将其通电至1000:

n = n.pow(1000);

现在,使用
toString()
将其转换为字符串,然后将每个字符添加到结果中,将其更改为
int
。应该这样做。

因为2^1000太大了!可能是四舍五入的问题。仅仅因为它在
double
的范围内,并不意味着你得到所有的数字直到单位。double只有15-16位的精度,不管数字有多大。