项目Euler#6两个代码,不同的答案仅适用于大输入.为什么?

COO*_*ANS 3 java truncated

这里有两个代码用于解决项目euler中的问题6:为什么在我将数字设置得更大之前它们会给出类似的答案?(100,000)

前十个自然数的平方和是,

1 2 + 2 2 + ... + 10 2 = 385

前十个自然数之和的平方是,

(1 + 2 + ... + 10)2 = 55 2 = 3025

因此,前十个自然数的平方和与总和的平方之差为3025-385 = 2640.

找出前100个自然数的平方和与总和的平方之间的差异.

代码1:

public class Problem_Six_V2 {

public static void main(String[] args) {

    long limit = 100000;
    long sum = (limit * (limit + 1)) / 2;
    long sumOfSqr = (long)((((2*limit)*limit)+((2*limit)*1)+(1*limit)+(1*1))*limit)/6;
    System.out.println(Math.pow(sum, 2) +" "+ sumOfSqr);
    System.out.println(Math.pow(sum, 2) - sumOfSqr);
}

}
Run Code Online (Sandbox Code Playgroud)

^^^输出= 2.500016666416665E19

这是代码二:

public class Problem_Six {

public static void main(String[] args) {

    long sum = 0;
    long sumSqr = 0;
    long sumOfSqr = 0;

    for(long i = 1; i <= 100000; i++){
        sum += i;
        sumOfSqr += Math.pow(i,2);
    }
    sumSqr = (long) Math.pow(sum, 2);
    System.out.println(sumSqr +" "+ sumOfSqr);
    System.out.println(sumSqr - sumOfSqr);
}
}
Run Code Online (Sandbox Code Playgroud)

^^输出= 9223038698521425807

我猜这与使用的类型有关,但它们在两个代码中看起来相似......嗯

pet*_*rov 6

Math.pow(i,2)接受双打作为参数.双打不是100%精确,
你会失去精确度.坚持只对int/long进行操作.答案很小
,甚至适合int.

不确定为什么你使用100000作为限制,问题6有100作为限制.

在Java中,当整数运算的结果不适合int变量时,
你应该使用long,当它们甚至不适合长变量时,你
应该使用BigInteger.

但是避免双打,它们对于这类任务并不精确.

这是你的程序更正.

import java.math.BigInteger;

public class Problem_Six {

    public static void main(String[] args) {

        BigInteger sum = BigInteger.ZERO;
        BigInteger sumSqr = BigInteger.ZERO;
        BigInteger sumOfSqr = BigInteger.ZERO;

        for (long i = 1; i <= 100000; i++) {
            sum = sum.add(BigInteger.valueOf(i));
            sumOfSqr = sumOfSqr.add(BigInteger.valueOf(i * i));             
        }

        sumSqr = sum.multiply(sum);
        System.out.println(sumSqr + " " + sumOfSqr);
        System.out.println(sumSqr.subtract(sumOfSqr).toString());

        // System.out.println(Long.MAX_VALUE);
    }

}
Run Code Online (Sandbox Code Playgroud)