此题,如果代码的最坏时间复杂度是线性的,只能通过大概 91% 的样例(我使用 java 的测试结果),原因之所在就是会有超大素数作为特殊样例来恶心人:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long num = scanner.nextLong();
for (long i = 2; i <= num; ++i) {
while (num % i == 0) {
System.out.print(i + " ");
num /= i;
}
}
System.out.println();
} 但是正如我们判断数 num 是不是质数时,没必要从 2 一直尝试到 num 一样,此题中的大循环也大可不必写一个到 num 的循环,写到 即可,如果此时数字还没有除数,则可判定其本身是一个质数,没有再除下去的必要了,直接打印其本身即可:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long num = scanner.nextLong();
long k = (long) Math.sqrt(num);
for (long i = 2; i <= k; ++i) {
while (num % i == 0) {
System.out.print(i + " ");
num /= i;
}
}
System.out.println(num == 1 ? "": num+" ");
} 
京公网安备 11010502036488号