当前位置: 首页 > 知识库问答 >
问题:

如何确定极大的质因数?

高运诚
2023-03-14

所以我想找到关于欧拉计划的问题3的答案。我需要确定给定数的最大素数因子。

引述欧拉项目:“13195的素数因子是5、7、13和29。600851475143中最大的素数因子是什么?”

我已经构建了我的代码,它在任何int大小的东西上都能完美地工作。但是由于它们给出的巨大数字,我的代码存在转换问题。

起初,我尝试切换到长变量和长数组,但我得到了错误:“可能从long到int的有损转换”

那么,我如何才能让我的代码接受非常长的数字呢?

public class Test {

long[] delers;

public static void main(String[] args) {
    Test test = new Test();
    test.determineDividers(600851475143,determineNumberOfDividers(600851475143));
    long a = test.determineHighestPrime(test.delers);
    System.out.println(a);
}

public void determineDividers(long getal,long aantalDelers) {
    delers= new long[aantalDelers];
    long k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            delers[k]=i;
            k++;                
        }
    }
}

public long determineNumberOfDividers(long getal) {
    int k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            k++;               
        }
    }
    return k;
}

public boolean determinePrime(long getal) {
    for (long i = 2; i < getal; i++) {
        if (getal % i == 0) {
            return false;
        }
    }
    return true;
}

public long determineHighestPrime(long[] deler) {
    for (long i = deler.length - 1; i > 0; i--) {
        if (determinePrime(deler[i]) == true) {
            return deler[i]);
        }
    }
    return 0;
}

}

谢谢你抽出时间

编辑1:添加了PE中的示例。

编辑2:添加的解决方案

public class Test {

long[] delers;

public static void main(String[] args) {
    Test test = new Test();
    test.determineDividers(600851475143L,test.determineNumberOfDividers(600851475143L));
    long a = test.determineHighestPrime(test.delers);
    System.out.println(a);
}

public void determineDividers(long getal,int aantalDelers) {
    delers= new long[aantalDelers];
    int k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            System.out.println(i);
            delers[k]=i;
            k++;                
        }
    }
}

public int determineNumberOfDividers(long getal) {
    int k = 0;
    for (long i = 1; i < getal; i++) {
        if (getal % i == 0) {
            k++;               
        }
    }
    return k;
}

public boolean determinePrime(long getal) {
    for (long i = 2; i < getal; i++) {
        if (getal % i == 0) {
            return false;
        }
    }
    return true;
}

public long determineHighestPrime(long[] deler) {
    for (int i = deler.length - 1; i > 0; i--) {
        if (determinePrime(deler[i]) == true) {
            return deler[i];
        }
    }
    return 0;
}

}

共有2个答案

夏侯涵映
2023-03-14

将所有将得到“巨人”的变量更改为BigInteger。您需要更新数学以使用函数调用而不是java操作数,但它们都可以在BigInteger中使用。

姬乐
2023-03-14

设置数组时,数组的大小必须是int。因此,这:

delers= new long[aantalDelers];

无法编译,因为您已将参数a antaldelers声明为long。但是,当您调用确定标识符(determineDividers)时,为确定标识符(antaldelers)传入的值是确定标识符(determinediumberofdividers)的结果,您声明该值返回长,但该函数表示返回k,而k是int。

所以我认为您可以更改确定性NumberOfDividers,使其返回int而不是long,并将aantalDelers参数更改为int而不是long。这样您将避免任何long-to-int转换。此外,在使用ki作为数组索引并将它们声明为long的地方,这些也应该更改为int

恕我直言,我认为这是可行的,因为我认为一个263的数字不能有超过231的除数。但是,如果我的数学是错误的,并且它可以,那么除了数组之外,您还需要其他一些机制。(事实上,无论如何,您可能需要想出另一个算法;我感觉这个算法需要很长时间才能运行。)

 类似资料:
  • 所以我有一个问题,当我计算一个数字时,比如说15,我必须显示这个:15=3x5,但我得到的是3x5x5,我不知道如何使它变成这样,所以它只显示3x5。还有一个问题是,我输入的数字是否是素数。有办法解决这个问题吗?我只需要这些,然后再编辑其他东西。

  • 我有一些用于Euler项目的代码。求最大素因子600851475143。这需要很长时间才能完成,至少需要30分钟。你们能看出来是因为我的代码太长了,还是我的代码错了。还有,有什么让运行时间更快的提示吗?

  • 问题内容: 好的,我的问题不是如何确定数字是否为质数,因为我想我已经知道了,但是更多的是如何使其正确显示。 这是我的代码: 现在我的问题是,如果数字最终等于9,它会说它是质数,而不是。我认为问题在于中断在一个循环后就停止了它,因此它不会递增变量p,因此仅测试除以2(我认为)。但是,如果我删除断点,它将在每次通过时打印出“和不是素数”,直到退出循环为止。不知道该怎么办。 问题答案: 查找数字是否为素

  • 当我在Linux上调用时,它返回。相同的代码适用于Windows,并且我安装了适当的图形驱动程序。如何确定它返回 null 的原因? 编辑:结果它返回了null,因为我要求的OpenGL版本显然在我的上网本上不可用。这解决了我的问题,但没有真正回答我的问题。

  • 当你遇到问题时,首先要做的是找出导致问题的程序和设备部件: ·如果遇到下述征兆之一,或许是因为硬件问题(如内存、主板、CPU或硬盘)或内核问题: 1. 键盘不工作。正常情况下可通过按Caps Lock建进行检查。如果Caps Lock的点亮状态未改变,就需要更换键盘(在此之前,应尝试重启计算机,并检查与键盘相连的所有电缆)。 2. 鼠标指针不移动。 3. 机器未对远程机器的Ping命令做出应答。