Попытка найти наименьшее положительное число, которое делится поровну на все числа от 1 до 20 - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь найти наименьшее положительное число, которое делится поровну на все числа от 1 до 20. Нам дано, что 2520 - это наименьшее число, которое можно разделить на каждое из чисел от 1 до 10 без любой остаток. Мой find () находит число, начиная с 2520, которое делится на все числа от 1 до 20, но по какой-то причине возвращает 2520. Я не могу найти, что не так с моей функцией find ()?

  public class Solution  {

  public ArrayList<Integer> list = new ArrayList<Integer>();


// creating a list of integers from 1 to 20
public ArrayList<Integer> addtolist() {
  for (int i = 1; i <= 20; i++) {
    list.add(i);
  }
  return list;
}

// finds the smallest positive number that is evenly divisible by all 
of the numbers from 1 to 20

public int find() {
  int num = 2520;
  while(true) {
    for(int i: list) {
      if(num % i == 0) {
        return num;
      }
      else {
        num = num + 1;
      }

    }
  }
}

public static void main(String[] args) {
  Solution sol = new Solution();
  sol.addtolist();
  System.out.println(sol.find());//2520
}


}

Ответы [ 4 ]

0 голосов
/ 06 мая 2018

Хороший вопрос!

long answer = LongStream.iterate(1, n -> n + 1)
    .filter(n -> IntStream.rangeClosed(1, 20).allMatch(f -> n % f == 0))
    .findFirst().getAsLong();

Ответ 232792560

Очевидно, что существует множество сочетаний клавиш с использованием математики (например, только просмотр четных чисел, игнорирование чисел от 1 до 20, которые являются факторами других чисел в этом диапазоне).

0 голосов
/ 06 мая 2018

Вы возвращаетесь из цикла for, когда (num % i == 0), учитывая, что я начинаю с 1, это всегда верно. Вместо этого вам нужно подождать до конца, чтобы вернуться:

public int find() {
  int num = 2520;
  while(true) {
    boolean allDivisible = true;
    for(int i: list) {
      if(num % i != 0) {
        allDivisible = false;
        break;
      }
    }
    if (allDivisible) {
      return num;
    else {
      num = num + 1;
    }
  }
}
0 голосов
/ 06 мая 2018

В вашем коде:

for(int i: list) {
  if(num % i == 0) {
    return num; // Returns immediately. 
  }
  else {
    num = num + 1;
  }
}

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

0 голосов
/ 06 мая 2018

Ваша функция find возвращает num, если any i in list делит ее. Он должен возвращать num, только если каждый i в num является делителем.

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

...