代码错误.可以被 1 到 20 的所有数字均匀整除的最小正数是什么

  • 本文关键字:是什么 数字 错误 代码 java
  • 更新时间 :
  • 英文 :


你好,我正在做一个欧拉项目:

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());
}

尝试:

   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

你的数字几乎总是可以被 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的价值。

问题是您的外循环可能会完全耗尽,您仍然可能无法找到所需的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

警告:您需要仔细选择数据类型,因为对于较大的数字,它可能会溢出。

最新更新