2014-01-20 2 views
0

Кажется, что мой код не работает для проекта Эйлера, задача 1. Проблема гласит:Проект Эйлера # 1

Если мы все натуральные числа меньше 10, кратные 3 или 5, мы получаем 3, 5, 6 и 9. сумма этих мультипликаторов составляет 23.

Найти сумму всех чисел, кратных 3 или 5 ниже 1000.

выход моей программы

мой код:

private static final int max = 1000; 
    private static int sum; 

    public static void main(String[] args) 
    { 
     addMultiples(3); 
     addMultiples(5); 
     System.out.println(sum); 
    } 

    private static void addMultiples(int mult) 
    { 
     int x = mult; 
     while(x < max) 
     { 
      sum += x; 
      x += mult; 
     } 
    } 

кажется, что основные основы математики просто ускользает меня, и это действительно обескураживает меня стать программистом, если я не в состоянии найти то, что кажется решением такого простого вопроса.

+10

Подсказка: 15 кратны 3 __and__ 5. – Blastfurnace

+0

вы добавляете числа тех, кратны и 3 и 5 дважды в сумму. – Juvanis

+2

OP: не расстраивайтесь, если вы не можете заставить свою программу работать с первой попытки. _It случается со всеми нами. –

ответ

6

Во-первых, и самое главное, не отчаивайтесь. Это просто проблема, и это очень плохой показатель потенциала как программиста. Просто продолжайте практиковать, и любой, ваша ошибка больше математика, чем программирование.

Если мы перечислим числа, кратные 3 меньше 16, получим: 3, 6, 9, 12, 15. Если мы перечислим числа, кратные 5 меньше 16, получим: 5, 10 , 15.

Уточнить проблему?

Вы считаете 15 дважды. Возможно, вы, возможно, выясните реализацию, поэтому я не буду беспокоиться о предоставлении вам кода. Это не сделает вас лучше.

Кроме того, эта проблема может быть решена гораздо эффективнее с помощью математики и сумм, но я оставлю это вам.

1

У вас есть небольшая ошибка.

15 - кратна 5 и кратна 3. Поэтому вы не хотите считать это дважды! :)

Одна вещь, которую вы могли бы сделать (это моя функциональная сторона) - создать список от 0 до макс. Затем вы создаете метод, который извлекает все кратные 3 и добавляет их в список результатов и удаляет их из списка ввода. Этот обрезанный список теперь передается методу, который отфильтровывает все кратные 5 и добавляет их в тот же список вывода.

Вы берете сумму своего списка.

Edit: Решение Иоганна Trümpelmann непродолжительно, читаемое и более исполнительский, так что вы можете пойти с этим один .. :)

2

Ошибки вы сделали там добавляющий кратные 3 и 5 как 15 дважды.

public static void main(String[] args) { 
    long sum = 0; 
    for(int i = 0; i <= 1000; i++) if(i%3==0 || i%5==0) sum += i; 
    System.out.println(sum); 
} 
+1

-1 для публикации решения, которое не было задано. –

1

Ваша ошибка в том, что вы не учли, что умножение ваших делителей было засчитано дважды. Поэтому я предлагаю вам изменить addMultiples, чтобы получить массив разделителей и.Проверьте разделители внутри цикла, если они делят на определенные номера .:

private static int sum; 

public static void main(String[] args) 
{ 
    addMultiples(new int[]{3,5}); 
    System.out.println(sum); 
} 

private static void addMultiples(int[] mult) 
{ 
    int x = 1; 
    while(x < max) 
    { 
     for(int i = 0; i < mult.length; i++){ 
      if(x % mult[i] == 0){ 
       sum += x; 
       break; 
      } 
     } 
    } 
}