此题,如果代码的最坏时间复杂度是线性的,只能通过大概 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+" "); }