【问题标题】:Java, Largest prime factorJava,最大素数
【发布时间】:2015-03-23 02:51:44
【问题描述】:

我正在尝试解决这个问题: https://www.hackerrank.com/contests/projecteuler/challenges/euler003/submissions/code/2977447

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

给定数 N 的最大质因数是多少?

输入格式 第一行包含 T,测试用例的数量。接下来是 T 行,每行包含一个整数 N。

输出格式 对于每个测试用例,显示 N 的最大素因子。

约束

     1≤T≤10 
    10≤N≤1012

我下面的代码在第五次测试中出现超时错误(我们不知道实际内容)。任何想法为什么它没有通过测试?谢谢

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

/* Author: Derek Zhu
 * 1and1get2@gmail.com
 * https://www.hackerrank.com/contests/projecteuler/challenges/euler003
 * */
// The part of the program involving reading from STDIN and writing to STDOUT has been provided by us.

public class Solution {
    public static boolean D = true;
    static BufferedReader in = new BufferedReader(new InputStreamReader(
            System.in));
    static StringBuilder out = new StringBuilder();

    public static void main(String[] args) throws NumberFormatException,
            IOException {
        int numOfCases = Integer.parseInt(in.readLine());

        for (int i = 0; i < numOfCases; i++){
            calculateCase(Long.parseLong(in.readLine())); 
        }


    }
    private static void calculateCase(Long input) throws IOException{

        if (D) System.out.println("Processing: " + input);
        long largestPF = prime(input);

        if (D) System.out.print("Final calculate: ");
        System.out.println(largestPF);
    }
    private static long prime(long n){
        long i = 2;
        while ( n % i != 0 && i < n){
            i ++;
        }
        if (D) System.out.println("found i: " + i);

        if (i < n){
            return prime(n/i);
        } else {
            return n;
        }
    }
    public static int primeFactors(BigInteger number)     {
        BigInteger copyOfInput = number;
        int lastFactor = 0;
        for (int i = 2;
        BigInteger.valueOf(i)
        .compareTo(copyOfInput) <= 0; i++) {
            if (copyOfInput.mod(BigInteger.valueOf(i))
            .compareTo(BigInteger.ZERO) == 0) 
            {
                lastFactor = i;
                copyOfInput = copyOfInput
                .divide(BigInteger.valueOf(i));
                i--;
            }
        }
        return lastFactor;
    }
}

【问题讨论】:

  • N 真的只限于 1012,还是在剪切粘贴过程中丢失了什么?
  • 您向我们展示primeFactors 方法有什么原因吗?它似乎没有被使用。
  • 一些一般性建议:(1)你的循环不必上升到i &lt; n;你可以更快地切断它。 (2) 您可以跳过大多数偶数除数。 (3) 如果你发现 2 和 3 不能整除prime,但 5 能整除,那么当你寻找prime/5 的质因数时,你应该不需要再尝试 2 和 3。我不知道这些建议是否足以通过。
  • @ajb 抱歉,我应该检查一下,应该是 10^12。
  • 不要对非代码文本使用代码格式。

标签: java math


【解决方案1】:

谢谢@ajb

事实证明,采用另一种方法会更有效。

private static long method2(long NUMBER){
        long result = 0;
        for(int i = 2; i < NUMBER; i++) {
            if(NUMBER % i == 0 && isPrime(NUMBER / i)) {
                result = NUMBER / i;
                break;
            }
        }
        return result;

    }
    private static boolean isPrime(long l) {
        for(long num = 2, max = l / 2 ; num < max; num++) {
            if(l % num == 0) {
                return false;
            }
        }
        return true;
    }

完整的代码与时间比较可以在这里找到: https://github.com/1and1get2/hackerrank/blob/master/Contests/ProjectEuler%2B/003_LargestPrimeFactor/src/Solution.java

【讨论】:

  • 不...仍然无法正常工作。发现了一个有趣的号码:222391364219
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2014-03-08
相关资源
最近更新 更多