请考虑以下代码:
public static void main(String[] args){
int target = 99999;
revised(target);
long total = 0;
for(int x = 0; x <= target; x++){
if(x % 3 == 0 || x % 5 == 0)
total+=x;
}
System.out.println("Method B: " + total);
}
private static double findSum(int target, int divisor){
int upperBound = target/divisor;
return divisor*(upperBound+1)*upperBound*.5;
}
private static void revised(int target){
double sumOne = findSum(target, 3);
double sumTwo = findSum(target, 5);
double sumThree = findSum(target, 15);
System.out.printf("Method A: %.0f \n", sumOne + sumTwo - sumThree);
}
Project Euler#1问题:打印可被3或5整除的整数之和。
当目标是9,99,999,9999时,以下代码是正确的;但是,当目标变量设置为99999时失败。修订函数生成的答案不会产生与主函数中的强力方法相同的结果。我不相信这是由于双重类型的溢出造成的。
有人可以解释一下为什么修改后的函数在给定大数时会失败但在给出较小的数字时产生相同的结果(如强力方法)?
答案 0 :(得分:1)
在DataType
Double
public static void main(String[] args){
int target = 99999;
revised(target);
}
private static double findSum(double target, double divisor){
double upperBound = target/divisor;
System.out.println("|"+upperBound+"|"+target+"|"+divisor);
return divisor*(upperBound+1)*upperBound*.5;
}
private static void revised(double target){
double sumOne = findSum(target, 3);
double sumTwo = findSum(target, 5);
double sumThree = findSum(target, 15);
System.out.printf("%.0f \n", sumOne + sumTwo - sumThree);
System.out.println("|"+sumOne+"|"+sumTwo+"|"+sumThree);
}
当执行转换循环数据类型时会发生此问题