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

Project Euler#3在Java中永远使用

拓拔弘扬
2023-03-14

欧拉项目的问题#3是:

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

600851475143的最大质因数是什么?

我的解决方案需要很长时间。我认为我得到了正确的实施;然而,当使用大数字进行测试时,我无法看到结果。它永远运行。我想知道我的算法是否有问题:

public class LargestPrimeFactor3 {

    public static void main(String[] args) {
        long start, end, totalTime;
        long num = 600851475143L;
        long pFactor = 0;

        start = System.currentTimeMillis();

        for(int i = 2; i < num; i++) {
            if(isPrime(i)) {                
                if(num % i == 0) {
                    pFactor = i;                        
                }
            }
        }

        end = System.currentTimeMillis();
        totalTime = end - start;
        System.out.println(pFactor + " Time: "+totalTime);
    }

    static boolean isPrime(long n) {

        for(int i = 2; i < n; i++) {
            if(n % i == 0) {
                return false;
            }
        }        
        return true;
    }     
}

共有3个答案

韩欣怿
2023-03-14
public HashSet<Integer> distinctPrimeFactors(int n) //insane fast prime factor generator
{
    HashSet<Integer> factors = new HashSet<Integer>();
    int lastres = n;
    if (n==1)
    {
        factors.add(1);
        return factors;
    }
    while (true)
    {
        if (lastres==1)
            break;
        int c = 2;
        while (true)
        {
            if (lastres%c==0)
                break;
            c++;
        }
        factors.add(c);
        lastres/=c;
    }
    return factors;
}

如果您想为一个数快速生成不同的素数因子,请使用此方法,该方法可以在每次迭代时使该数变小。您可以将int更改为long,它应该适合您。

施昊然
2023-03-14

您应该在找到每个因子时将其划分出来。然后无需测试它们的质数,当我们按升序枚举可能的除数时(任何这样找到的除数都不能是复合的,它的因子已经被划分出来了)。然后您的代码变成:

class LargestPrimeFactor4 {

    public static void main(String[] args) {
        long start, end, totalTime;
        long num = 600851475143L;   // odd value is not divided by any even
        long pFactor = 1L;

        start = System.currentTimeMillis();

        for(long i = 3L; i <= num / i; ) 
        {
            if( num % i == 0 ) {
                pFactor = i;
                num = num / i;
            }
            else {
                i += 2;
            }
        }
        if( pFactor < num ) { pFactor = num; }

        end = System.currentTimeMillis();
        totalTime = end - start;
        System.out.println( pFactor + " Time: " + totalTime);
    }
}
汪飞捷
2023-03-14

虽然不是用Java,但我认为您可能了解以下内容。基本上,只需测试奇数除数和一个数的平方根就可以减少迭代次数。这里有一种蛮力方法,可以在C#中立即产生结果。

static bool OddIsPrime (long oddvalue)  // test an odd >= 3 
{
    // Only test odd divisors.
    for (long i = 3; i <= Math.Sqrt(oddvalue); i += 2)
    {
        if (value % i == 0)
            return false;
    }
    return true;
}

static void Main(string[] args)
{
    long max = 600851475143;   // an odd value
    long maxFactor = 0;

    // Only test odd divisors of MAX. Limit search to Square Root of MAX.
    for (long i = 3; i <= Math.Sqrt(max); i += 2)
    {
        if (max % i == 0)
        {
            if (OddIsPrime(i))  // i is odd
            {
                maxFactor = i;
            }
        }
    }
    Console.WriteLine(maxFactor.ToString());
    Console.ReadLine();
}
 类似资料:
  • 我是初学者。下面我对欧拉项目3号问题的解决方案需要很长时间才能返回答案。有人能提出改进建议吗?我做错了什么?我写了一些代码来帮助我思考这个问题的所有难题。 13195的质因数是5、7、13、29。 600851475143的最大质因数是什么?

  • 问题内容: 我有一些关于永久使用Node.js的问题,可能很琐碎。根据我的阅读,永远可以通过编程使用,并且它维护了一个列表,其中包含所有永远使用的脚本。该进程终止后,它会自动产生一个新的进程,直到停止为止。 但是,我的问题是,如何永远做到这一点?是否还会添加这些脚本以在启动时启动? 问题答案: 您可以像这样永久性地使用程序: 在node.js脚本中使用Forever实例: 您应该花一点时间阅读一下

  • 有什么让我怀念的吗?如果我必须手动关闭连接,是不是至少可以从Javers那里收到一个不再需要连接的通知?

  • 我在weblogic 12c中配置了我的域。当我尝试启动服务器时,它们会出现(状态更改为正在运行),并且web服务处于活动状态。但是,weblogic控制台中最后一个操作的状态始终是“任务进行中” 未更改为已完成的可能原因是什么。 此外,在我重新启动管理后,它会变为无。

  • 所以我在做一些应该很简单的事情,但显然不是在Spark SQL中。 null 表有外键字段,但数据库中没有定义显式fk关系。我在用Innodb。 Spark中的执行计划: 计划: ==物理计划==TungstenProject[Address_ID#0L]

  • 问题内容: 我今天发现了一种不寻常的Java方法: 根据我所读过的有关Java传递变量(不管是否传递复杂对象)的行为的所有资料,该代码完全不起作用。所以…我在这里想念什么吗?是我身上遗失了一些微妙之处,还是这段代码属于thedailywtf? 问题答案: 正如Rytmis所说,Java按值传递引用。这意味着您可以合法地对方法的参数调用变异方法,但不能重新分配它们并期望值传播。 例: 编辑: 在这种