Problem: HJ6 质数因子
题目描述
描述
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 ) 数据范围:
输入描述:
输入一个整数。
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
示例1
输入:
180输出:2 2 3 3 5
解题思路
将输入的数字开平方根,然后从2开始查找质数
算法流程
- 首先创建一个
Scanner对象,用于从用户读取输入。- 从用户读取一个长整数,并将其赋值给变量
num。- 计算
num的平方根,并将其赋值给变量k。- 从2到
k(包括k)开始循环,并检查num是否可被每个数字整除。- 如果
num可被当前数字整除,则打印该数字,并将num除以该数字。- 重复步骤5,直到
num不再可被当前数字整除。- 循环结束后,检查
num是否等于1。如果等于1,表示所有质因数已找到并打印。如果不等于1,表示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 + " ");
}
复杂度
- 时间复杂度:
添加时间复杂度, 示例:
- 循环从2到k的范围,其中k是num的平方根。因此,循环的次数大约是O(sqrt(num))。
- 在循环中,每次都检查num是否可被当前数字整除,这需要O(1)的时间。
- 因此,整个程序的时间复杂度是O(sqrt(num))。
- 空间复杂度:
添加空间复杂度, 示例:
- 程序只使用了一个Scanner对象来读取输入,这需要O(1)的空间。
- 因此,整个程序的空间复杂度是O(1)。