【发布时间】: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 < n;你可以更快地切断它。 (2) 您可以跳过大多数偶数除数。 (3) 如果你发现 2 和 3 不能整除prime,但 5 能整除,那么当你寻找prime/5的质因数时,你应该不需要再尝试 2 和 3。我不知道这些建议是否足以通过。 -
@ajb 抱歉,我应该检查一下,应该是 10^12。
-
不要对非代码文本使用代码格式。