题解 | #质数因子#
质数因子
https://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
System.out.println(findZhiYinZiList(sc.nextInt()));
}
}
/**
* 数学知识忘完了,快快补课:
* 质数(也称素数):一个自然数,如果只有1和它本身两个约数,这个数叫做质数。
* 因数(也称约数):指整数a除以整数b(b≠0) 的商正好是整数而没有余数,称b是a的因数。
* 质因数:一个数的因数是质数,就叫做这个数的质因数。
* 若a是b的因数,且a是质数,则称a是b的质因数。例如2,3,5均为30的质因数。6不是质数,所以不算。7不是30的因数,所以也不是质因数。
* 互质数:公因数只有1的两个非零自然数,叫做。
* 合数:除了1和它本身还有其它正因数。
* 1只有正因数1,所以它既不是质数也不是合数。
* 解题思路:
* 关键在于只需要检查小于等于sqrt(n)的因子。这是基于以下原理:
* 如果n有一个因子a(a > 1),那么必然存在另一个因子b(b > 1),使得a * b = n。
* 这意味着a和b中至少有一个因子不大于sqrt(n),否则a和b的乘积将大于n(因为a > sqrt(n)且b > sqrt(n)时,a * b > n)。
*
* 因此,可以得出结论:如果n有一个大于sqrt(n)的因子,那么它必定还有一个小于等于sqrt(n)的对应因子。
* 意味着我们只需要检查小于等于sqrt(n)的因子,就可以找到n的所有因子。
*
* 通过仅检查小于等于sqrt(n)的因子,我们可以显著减少计算量,提高算法的效率。
* 在这道题中,我们使用一个for循环检查小于等于sqrt(n)的因子,如果找到一个因子,将其添加到结果中,并相应地更新n的值。
* 这样,可以确保找到n的所有质因子,同时避免不必要的计算。
* @param n
* @return
*/
private static String findZhiYinZiList(int n) {
StringBuilder sb = new StringBuilder();
for (int i = 2; i * i <= n; i++) {
while (n % i == 0) {
sb.append(i).append(" ");
n = n / i;
}
}
// 最后的商
if (n > 1) {
sb.append(n).append(" ");
}
return sb.toString().trim();
}
}
#质数因子#
