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

项目Euler#3

阎知
2023-03-14

问题:

13195的质因数是5、7、13、29。

数字600851475143中最大的素因子是什么?

我发现这个很简单,但运行这个文件花了很长时间,已经运行了一段时间,我得到的最高数字是716151937。

这是我的代码,我只是要等待还是我的代码中有错误?

        //User made class
public class Three
{   
        public static boolean checkPrime(long p)
        {
            long i;
            boolean prime = false;
        for(i = 2;i<p/2;i++)
        {
            if(p%i==0)
            {
                prime = true;
                break;
            }
        }
    return prime;
    }   

}

    //Note: This is a separate file
public class ThreeMain
{
    public static void main(String[] args)
        {
            long comp = 600851475143L;
            boolean prime;
            long i;
            for(i=2;i<comp/2;i++)
            {
                if(comp%i==0)
                {
                    prime = Three.checkPrime(i);
                    if(prime==true)
                    {
                        System.out.println(i);
                    }
                }
            }
        }       
}

共有3个答案

朱宜
2023-03-14

一旦你找到了你的数字的一个因子,你就可以把它除掉,使剩下的数字变小。

if (prime)
{
    System.out.println(i);

    // The factor may occur multiple times, so we need a loop.                
    do {
        comp /= i;
    } while (comp % i == 0);
}

这样做还保证了每当i划分comp时,i必须是素数,因为所有较小的素数都已被划分出来,因此您可以删除素数检查:

for (i = 2; i < comp/2; i++)
{
    if (comp % i == 0)
    {
        System.out.println(i);

        do {
            comp /= i;
        } while (comp % i == 0);
    }
}

最后,您只需要检查i,直到comp的平方根,因为任何大于平方根的因子都必须伴随一个小于平方根的因子。(即,如果i*j==comp,则ij中的一个必须是

还有一些技巧可以应用,但对于这个问题来说,这应该足够了。

邹驰
2023-03-14

您可以简单地循环到sqrt(2)而不是n/2,这将节省大量时间。

齐朝明
2023-03-14

你正朝着正确的方向前进,但是你已经远远超过了你需要去的地方,并且在这个过程中犯了一些错误。你现在检查的比你需要验证的质数高得多(尤其是质数

检查素数的函数实际上为复合函数返回true,而不是素数。您的代码:

    if ((p%i==0) {
        prime = true;
        break; }

应该是

    if ((p%i==0) {
        prime = false;
        break; }

在main方法中,实际上根本不需要布尔素数。从问题的上下文来看,我们可以假设将有两个以上的素数因子,这意味着我们需要将comp减少到一个更小且更易于管理的数字的最大素数因子是comp的立方根。因此,您的行(i=2;i

此外,您还可以:

    prime = Three.checkPrime(i);
    if(prime==true)

可减少至:

if (Three.checkPrime(i));

因为Three.checkPrime()将返回并最终被评估为布尔值。

 类似资料:
  • 问题内容: 欧拉计画的问题3是: 13195的主要因子是5、7、13和29。 600851475143的最大素数是多少? 我的解决方案需要永远。我认为我得到了正确的实施;但是,在进行大量测试时,我无法看到结果。它永远运行。我想知道我的算法是否有问题: 问题答案: 尽管不是Java语言,但我认为您可以做到以下几点。基本上,只需要测试奇数除数就可以减少迭代次数,并且最多可以减少数字的平方根。这是一种蛮

  • 问题内容: 13195的素数是5、7、13和29。600851475143的最大素数是多少? 好的,所以我正在研究python中的项目Euler问题3。我有点困惑。我无法确定我通过该程序获得的答案是否正确。如果有人能告诉我即时消息做错了,那太好了! 问题答案: 这个数字很大,不鼓励您使用蛮力。 将在打算把功能号码,这是 一个很大 的内存。 检查数字是否可以除以奇数并不意味着该奇数是质数。您提供的算

  • 我的代码: 输出:

  • 我试图解决欧拉三号工程,但我对停止计算的逻辑相当混乱。 以下是第三个Euler项目: 13195的质因数是5、7、13、29。 600851475143的最大质因数是什么? 我创建了一个函数来检查数字是否为素数: 以及一个函数,用于检查质数是否是该数的一个因子: 唯一的问题是主函数,我正在尝试这样的操作: 我知道逻辑不正确,但我真的坚持了一个多小时。 我知道这里的主要目标是循环,找到一个素数并检查

  • 我试图解决欧拉项目问题3,即: 13195的主要因子为5、7、13和29。数字600851475143中最大的素因子是什么? 这是我的解决方案,它适用于较小的值,但对于所需的数字却无法完成:

  • 问题内容: 该代码应该返回最大的质数。有关此任务的更多信息:https : //projecteuler.net/problem=3 我决定将checkFactors()的参数加倍,因为我试图测试为什么我的代码无法正常工作。 工作并返回“ 29”。 但是, 不起作用, “ int类型的600851475143超出范围”。 确实可以编译,但是在几秒钟后给了我ArithmeticException。