-1

我找不到我写的问题。我正在尝试 Project Euler #16,我需要对 2^1000 的所有数字求和。我的程序适用于小数字,但随着数字达到 18 位左右,它会中断。有什么帮助吗?

public static double digit(double n){

    return n % 10;

}

public static double sumofDigits(double n){

    double sum = 0;

    while(n > 1){

        sum += digit(n);
        n = Math.floor(n/10);

    }

    return sum;

}

public static void main(String[] args) {

    double x = Math.pow(2,1000);

    double y = 22222222222222222222d;

    System.out.println(sumofDigits(x));

            System.out.println(sumofDigits(y));

}

}

4

3 回答 3

5

double 的精度约为 16 位十进制数字。由于 2 power 1000 有更多的数字(大约 300),你根本无法使用双精度数。

看看 BigInteger 类。

于 2012-12-22T10:02:16.110 回答
1

你不能double在这里使用:它们只有有限的精度。(参见Java 原始数据类型

所以Math.pow(2,1000)只计算一些(第一个)数字和指数。

您必须使用一些处理任意长整数的库。(例如大整数

于 2012-12-22T09:59:40.947 回答
0

我现在明白了。我已经用代表该十进制数的 BigDecimal 对象替换了这里的所有双精度数,以便实现 # 的十进制精度 && 大小。谢谢大家。

于 2012-12-25T10:49:35.363 回答