题目链接
题目描述
给定一个正整数 ,请将
按从小到大的顺序分解为若干个质因数并输出。
解题思路
本题要求对一个正整数 进行质因数分解,我们可以使用试除法来解决。
具体步骤如下:
- 从最小的质数
开始,尝试看
能否被
整除。
- 如果
能被
整除,说明
是
的一个质因数。我们就输出
,然后用
除以
来更新
的值。我们重复这个过程,直到
不能再被
整除为止,这样可以处理掉所有等于
的质因数。
- 让
增加 1,继续对新的
进行上述操作。
- 我们可以发现,当
循环到
之后,如果
仍然大于 1,那么剩下的
一定是一个质数。这是因为如果剩下的
是一个合数,那么它必然可以分解成两个因子的乘积,其中至少有一个因子会小于或等于
,而这个因子在之前的循环中就已经被除掉了。因此,循环结束后,如果
,我们直接输出
即可。
例如,分解 18:
- 从
开始,18 能被 2 整除,输出 2,
变为 9。
- 9 不能被 2 整除。
变为 3,9 能被 3 整除,输出 3,
变为 3。
- 3 还能被 3 整除,输出 3,
变为 1。
- 循环结束,最终得到 2 3 3。
代码
#include <iostream>
using namespace std;
int main() {
long long n; // 使用 long long 避免 n 溢出
cin >> n;
bool first = true; // 用于控制空格输出
for (long long i = 2; i * i <= n; ++i) { // 使用 long long 避免 i*i 溢出
while (n % i == 0) {
if (!first) {
cout << " ";
}
cout << i;
first = false;
n /= i;
}
}
// 如果n最后还剩下大于1的数,那么它一定是一个质数
if (n > 1) {
if (!first) {
cout << " ";
}
cout << n;
}
cout << "\n";
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong(); // 使用 long 避免 n 溢出
boolean first = true; // 用于控制空格输出
for (long i = 2; i * i <= n; ++i) { // 使用 long 避免 i*i 溢出
while (n % i == 0) {
if (!first) {
System.out.print(" ");
}
System.out.print(i);
first = false;
n /= i;
}
}
// 如果n最后还剩下大于1的数,那么它一定是一个质数
if (n > 1) {
if (!first) {
System.out.print(" ");
}
System.out.print(n);
}
System.out.println();
}
}
n = int(input())
ans = []
i = 2
# 循环直到 i*i > n
while i * i <= n:
# 如果 n 能被 i 整除,说明 i 是一个质因数
while n % i == 0:
ans.append(i)
n //= i
i += 1
# 如果最后 n 还大于 1,说明剩下的 n 也是一个质因数
if n > 1:
ans.append(n)
# 将结果列表转换为字符串并用空格连接
print(*ans)
算法及复杂度
- 算法:试除法
- 时间复杂度:
,其中
是输入的整数。循环最多执行到
。
- 空间复杂度:对于 C++ 和 Java 实现,我们是直接输出,所以空间复杂度是
。对于 Python 实现,我们用一个列表来存储质因数,其长度最多为
,所以空间复杂度是
。