我试图找到可以被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
}
}
答案 0 :(得分:1)
如果find
中的任何 num
将i
分开,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中的数字,这是该范围内其他数字的因子)。