2015-07-01 3 views
0

Так что я делаю вызов Project Euler, и я застреваю в первом, я использую Java как pl. например, если нам нужно перечислить все натуральные числа ниже 10, кратные 3 или 5, мы получим 3, 5, 6 и 9. Сумма этих кратных равна 23. Нам нужно найти сумму всех кратных из 3 или 5 ниже N.Сумма всех кратных 3 или 5 ниже N. Project Euler

Мой код работает на Eclipse, но я получаю «Хорошая попытка, но вы не прошли этот тестовый пример». с стандартным выводом: Нет ответов, и когда я отправить код я получаю неправильный ответ на все тестовые случаях, вот код:

public class Solution { 
    public static void main(String[] args) { 
     for (int j = 0; j < args.length; j++) { 
      int N = Integer.parseInt(args[j]); 
      if (Somme(N) != 0) { 
       System.out.println(Somme(N)); 
      } 
     } 
    } 

    public static int Somme(int Nn) { 
     int s = 0; 
     for (int i = 0; i < Nn; i++) { 
      if (((i % 3) == 0) || ((i % 5) == 0) 
       && !(((i % 3) == 0) && ((i % 5) == 0))) { 
       s = s + i; 
      } 
     } 
     return (s); 
    } 
} 

UPDATE: Итак, я просмотрел все больше и получается, что это, как это должно быть сделано:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Solution{ 
public static void main(String[] args) throws IOException { 


    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String line = br.readLine(); 
    int Nbr = Integer.parseInt(line); 


     for(int j=0; j<Nbr;j++) 
     { 
      BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in)); 
      String line2 = br2.readLine(); 
      String[] numbers = new String[Nbr]; 
      numbers[j]= line2; 
      System.out.println(Somme(Long.parseLong(numbers[j]))); 
     } 

     } 


public static long Somme(long Nn) { 
    long s = 0; 
    for (int i = 0; i < Nn; i++) { 
     if (((i % 3) == 0) || ((i % 5) == 0)) { 
      s = s + i; 
     } 
    } 
    return (s); 
} 

}

Теперь единственной проблемой является то, что я хочу, чтобы иметь возможность читать все числа тО показать сумму, на данный момент он читает один номер и отображать сумму сразу после это, какие-то идеи?

+0

Проверить случаев Уголка! Если ввод больше, чем размер int – ganeshvjy

+0

Я не уверен, что понял вас, должен ли я контролировать ввод пользователя? – Hadh

+0

Не следует ли использовать стандартный ввод? Не как аргумент? – Wazaaaap

ответ

2

Вы пропускаете некоторые цифры, которые нельзя пропустить.

if (((i % 3) == 0) || ((i % 5) == 0) 
    && !(((i % 3) == 0) && ((i % 5) == 0))) 

Это утверждение говорит: i должно быть кратно 3 или 5 И не должно делиться на 3 и 5. Перефразированный: i должен быть делимым на 3 или 5, но не на оба из них. Просто удалите вторую строку, и она должна работать.

+0

Да, это правильно, строка, которую я сделал, ничего не делала, и у меня все еще такая же проблема, я думаю, что это то, что @zubergu сказал, что-то с System.in – Hadh

0

Я считаю, что это сочетание того, что сказал Turing85 и wazaaaap. Примеры для Project Euler показывают, что он не принимает разные входы. Вам просто нужно произвести правильный вывод. Так заменить Integer.parseInt(args[j]); с Integer.parseInt(1000); Чтобы добавить к тому, что Тьюринг сказал, решение должно следовать следующему psuedocode:

target=999 
sum=0 
for i=1 to target do 
if (i mod 3=0) or (i mod 5)=0 then sum:=sum+i 
output sum 
+1

'Integer.parseInt (1000);'? Как насчет «1000»? –

+0

Как OP запускает программу, не имеет значения. Если он/она хочет ввести параметр в качестве аргумента командной строки, это совершенно нормально. Результат не будет затронут (если аргумент командной строки не превысит «Integer.MAX_VALUE», но это не является целью упражнения). – Turing85

+0

Нет, вы видите, что в первой строке вы вставляете, сколько целых чисел у вас есть, например, если у меня есть 10 и 100, и я хочу знать сумму кратных 3 и 5 ниже 10 и сумму, которая ниже 100, вход должен быть : ** 2 ** ** 10 ** ** 100 ** выход: ** 23 ** ** 2318 ** – Hadh