试图找到可被1到20之间的所有数字整除的最小正数

时间:2018-05-05 21:13:48

标签: java algorithm math division greatest-common-divisor

我试图找到可以被1到20之间的所有数字整除的最小正数。我们得出2520是可以除以1到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 :(得分:1)

如果find中的任何 numi分开,list函数将返回num。如果i中的每个 num都是除数,它应该只返回{{1}}。

虽然必须说这远不是解决问题的最有效方法。

答案 1 :(得分:0)

你在(num % i == 0)时从for循环返回,假设我从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;
    }
  }
}

答案 2 :(得分:0)

在您的代码中:

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

一旦在列表中找到一个匹配的号码,就会返回。您要做的只是在找到与列表中的所有值匹配的值时才返回。

答案 3 :(得分:0)

好问题!

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

答案是232792560

显然有很多使用数学的快捷键(例如,只查看偶数,忽略1到20中的数字,这是该范围内其他数字的因子)。