你好我正在做一个Euler项目:
2520是可以除以1到10之间的每个数字的最小数字,没有任何余数。
从1到20的所有数字均可被整除的最小正数是多少?
但是我的代码中看不出有什么问题 请帮忙。
public long mainNumber()
{
long number=1;
for(int i=2;i<=20;)
{
while(number%i!=0)
{
number++;
}
i++;
}
return number;
}
public static void main(String[] args)
{
Smallest_multiple result =new Smallest_multiple();
System.out.println("The smalest multiple "+result.mainNumber());
}
答案 0 :(得分:1)
尝试:
public long mainNumber() {
long number = 1;
for (int i = 1; i <= 20; i++) {
if (number % i != 0) {
i = 1; //restart i
number++;
}
}
return number;
}
这将从1到20循环,每次检查i
是否均匀地划分number
。如果它没有,则将i
设置回1
并尝试下一个数字。当然,还有更优雅的方法。但只是我将其保留在帖子中呈现的迭代方式中。运行此结果会导致232792560
作为最终结果。
答案 1 :(得分:1)
你的数字几乎总是可以被i整除,在一个数字增量之后,即当你增加数字时,它可以被i的当前值整除,所以它只会停在20,就像那个最后一个数字,你要检查它是否可被整除。它需要同时被所有这些整除。这就是你在这里出错的地方。您只需要继续增加数字并检查它是否可以被1到20之间的所有数字整除。一旦它完成,那么您就获得了所需的数字。但是当你继续增加时要小心变量类型限制。
这真的不是一个困难的算法。这是一个非常简单的实现...
public class Test {
public static void main(String[] args) {
long number = 0;
int factors = Integer.parseInt(args[0]);
boolean found = false;
while (!found) {
number++; // OR you could use [number += 2;] instead, as we know it will be even. Performance improvement! :)
found = true;
for (int i = 2; i <= factors; i++) {
found = found && number % i == 0;
}
}
System.out.println("Number: " + number);
}
}
我已编写此控制台应用程序,您可以输入要检查的因子数。用法:java Test 20
以获得您想要的值232792560。
答案 2 :(得分:0)
问题是您的外环可能会完全耗尽,但您仍然可能找不到您正在寻找的number
。
你应该这样做:
private static long gcd(long a, long b)
{
while (b > 0)
{
long temp = b;
b = a % b;
a = temp;
}
return a;
}
public static long mainNumber()
{
long number = 1;
for(int i = 2; i <= 20; i++) {
number = number * (i / gcd(number, i));
}
return number;
}
public static void main(String[] args)
{
Smallest_multiple result =new Smallest_multiple();
System.out.println("The Smallest Multiple: " + result.mainNumber());
}
输出:
The Smallest Multiple: 232792560
您当前的算法对于大数字会失败,但如果您想尝试一下,那么您可以执行以下操作:
public long mainNumber()
{
long number = 3;
while(true)
{
boolean flag = true;
for(int i = 2; i <= 10; i++) {
if(number % i != 0) {
flag = false;
break;
}
}
if(flag) break;
else number++;
}
return number;
}
public static void main(String[] args)
{
Smallest_multiple result =new Smallest_multiple();
System.out.println("The Smallest Multiple: " + result.mainNumber());
}
请注意,我在这里计算10
而不是20
的结果。您可以根据需要修改循环中的条件。
输出:
The Smallest Multiple: 2520
警告:您需要仔细选择数据类型,因为它可能会溢出更大的数字。