从1到20查找lcm时,会出现错误“;在Main.gcd(Main.java:21)中;

从1到20查找lcm时,会出现错误“;在Main.gcd(Main.java:21)中;,java,Java,我试图找到数字的lcm(1,2,3,4…20),这是一个非常简单的java程序,但它给了我一个错误。此错误仅在循环运行到20时出现,但在循环运行到10时不会出现。答案是232792560,这是一个9位数的数字,应该很容易得到长数据类型,所以我怀疑这是一个溢出问题。我找不到错误,请帮忙 static long gcd(long a, long b) { if(a==b) return a; if(a>b) { return gcd(a-b , b);

我试图找到数字的lcm(1,2,3,4…20),这是一个非常简单的java程序,但它给了我一个错误。此错误仅在循环运行到20时出现,但在循环运行到10时不会出现。答案是232792560,这是一个9位数的数字,应该很容易得到长数据类型,所以我怀疑这是一个溢出问题。我找不到错误,请帮忙

static long gcd(long a, long b)
{
    if(a==b) return a;

    if(a>b)
    {
        return gcd(a-b , b);
    }
    else{
        return gcd(a, b-a);
    }
}

static long lcm(long a, long b)
{
    return (a*b)/gcd(a, b);
}   

public static void main(String[] args) {

    long l=1;
    for(long i=1;i<=20;i++)
    {
        l=lcm(l , i);
        System.out.println(l);
    }           
}
静态长gcd(长a、长b)
{
如果(a==b)返回a;
如果(a>b)
{
返回gcd(a-b,b);
}
否则{
返回gcd(a,b-a);
}
}
静态长lcm(长a、长b)
{
报税表(a*b)/gcd(a、b);
}   
公共静态void main(字符串[]args){
长l=1;

对于(long i=1;i计算gcd的递归算法会导致堆栈溢出。运行相同的算法(在python上快速测试),将lcm设置为1-14作为360360。要找到此和15的gcd,将导致360360/15递归调用(~24000),Java无法处理

您需要找到一种非递归的方法来查找gcd(或者至少是一种更有效的方法)


请查看。

如Holloway所述。对于gcd,您可以使用:

public static long gcd(long P, long Q) {
        if (P % Q == 0) {
            return Q;
        } else {
            return gcd(Q, P % Q);
        }
    }

它会产生什么错误?如果你提到你得到的错误,你会增加很多获得帮助的机会。如果你发布stacktrace会更好。我猜这是一个堆栈溢出。你查找gcd的递归算法会导致很多调用。是的,似乎是这样,这个错误只是在Main.gcd重复了一次(Main.java:21)“无限大。堆栈溢出的想法并没有出现在我的脑海中,因为我觉得这已经是欧几里德算法(而且它有点效率很低),而且速度足够快。谢谢,现在我知道错在哪里了,觉得很傻!