Java:Falha ao trabalhar com grandes números (Projeto de Euler:#1)
-
21-12-2019 - |
Pergunta
Considere o seguinte código:
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);
}
Projeto De Euler #1 Problema:Imprimir a soma dos números inteiros que são divisíveis por 3 ou 5.
O código a seguir é correta quando o alvo é de 9, 99, 999, 9999;no entanto, falhar quando o alvo variável é definida a 99999.A resposta gerada por revista função de não produzir o mesmo resultado que o método de força bruta, localizado na função principal.Eu não acredito que isto é devido a um estouro do tipo double.
Alguém por favor pode explicar por que a revista função de falha quando dado grandes números, mas produz os mesmos resultados (como o método de força bruta) quando determinado números menores?
Solução
Basta Usar O Mesmo DataType
em todo lugar 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);
}
Esse problema ocorre quando o tipo de dados é converter rodada é realizada