【问题标题】:Java Largest Prime Factor of LongJava Long 的最大素数
【发布时间】:2015-07-27 22:11:03
【问题描述】:

我试图找到一个大数的最大素数。例如,如果该数字是 573849284703,我的代码将如下所示:

public static void main(String[] args) {

    long number = 573849284703l;

    System.out.println(lgstprmfactor(number));

}

public static long lgstprmfactor(long number) {
    for (long i = 286924642352l; i > 0; i--) {
        if (number % i == 0 && isPrime(i) == true) {
            long answer = i;
            return answer;
        }
    }
    return 0;
}

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

但是运行需要很长时间 - 有什么建议可以加快运行速度或优化代码吗?

【问题讨论】:

标签: java prime-factoring


【解决方案1】:

提高运行时间的一个快速解决方案是在多个线程中实现您的算法,同时检查该数字是否是跨不同范围的主要因素。 IE。创建一个线程来检查它是否是 0 到 1000000 之间的质数因子,然后是 1000001+ 等的线程。

【讨论】:

  • 这更适合作为评论而不是答案。
  • 注明。我最近才开始回答堆栈溢出问题,但到目前为止还没有足够的声誉在不属于我自己的帖子上发布 cmets。我继续发布答案,因为正确实现的多线程将改善 OP 运行时。
  • 这很公平。只是让你知道。
【解决方案2】:
public static void main(String[] args)
 {
  long startTime = System.currentTimeMillis();
  System.out.println(largestprimefactor(573849284703l));
  long endTime = System.currentTimeMillis();
  System.out.println(endTime - startTime+" ms ");
 }

public static int largestprimefactor(long l)
{
    int i;
    long copyofinput = l;
    for(i=2;i<copyofinput;i++)
    {
        if(copyofinput%i==0){

            copyofinput/=i;
            i--;
        }
    }

    return i;
}

}

输出: 66718903

688 毫秒

【讨论】:

    【解决方案3】:

    这里的基本思想是:找到素因数时删除它们,不要搜索高于剩余数字的平方根,并跳过偶数(除了 2)。我还添加了一些错误检查和其他装饰。

    public static void main(String[] args)
    {
        try {
            System.out.println(largestPrimeFactor(573849284703l));
        } catch (ArithmeticException e) {
            System.out.println("Error factoring number: " + e.getMessage());
        }
    }
    
    private static long sqrtint(long n) {
      return (long)Math.sqrt(n + 0.5);
    }
    
    public static int largestPrimeFactor(long n) throws ArithmeticException
    {
        if (n < 2) throw new ArithmeticException(n + " < 2");
        while (n%2 == 0) n /= 2;
        if (n < 2) return 2;
        long i, root = sqrtint(n);
        for(i=3; i<root; i+=2)
        {
            if(n%i == 0) {
                n /= i;
                while (n%i==0) n /= i;
                if (n == 1) return i;
                root = sqrtint(n);
            }
        }
    
        return n;
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2021-08-22
      • 2019-08-13
      • 1970-01-01
      • 2011-05-26
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多