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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top