这题考察的要点有两个:
- 分解质因数方法。
- 超大质数的判断,如何能节省时间。(输入类型是
long
)
一、分解质因数的方法
这个不是很难,对于任意输入的num
,只要设定一个变量prime
的值为2,从2往上一个一个试,如果不能整除就+1:2不能整除就试3,3不能整除就试4,4不能整除就试5……循环往复,直到num
被除到剩下1为止。
由于对于任意正整数k,不能被k整除的数一定不能被k的倍数整除,例如不能被2整除则一定不能被4、6、8、……整除,因此在依次增加prime
的值的过程中,每次第一个能整除num
的数一定会是质数,保证了答案的正确性。
二、超大质数的判断
由于输入类型是long
,因此有可能会碰到很大的质数,导致超时。为了避免超时,需要根据以下知识点对算法进行优化:
对于正整数k:
- 如果k是合数,则其最大的质因数不超过√k。
- 如果k刚好是质数的平方,则其最大质因数刚好是√k。
- 如果k是质数,那么比√k大且比k小的整数都不能整除k。
所以为了判断k是不是质数,如果从2开始把各个整数都作为除数试一遍,且都不能整除,那么只要最多试到√k且发现都不能整除,则k就是质数。这样对于k最多只需要试√k次就能判断它是不是质数,有效解决了超时的问题。
完整代码如下(Java)
import java.lang.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLong()) { long num = sc.nextLong(); decomp(num); } sc.close(); } private static void decomp(long num) { List<Long> outputs = new ArrayList<Long>(); if (num < 2) { return; } long prime = 2; while (num >= 2) { if (prime > Math.sqrt(num)) { // this means that num by itself is a prime // this trick is used for very large primes prime = num; } if (num % prime == 0) { num /= prime; System.out.print(prime); System.out.print(" "); } else { ++prime; } } System.out.println(); } }