HJ6 质数因子

123 阅读2分钟

Problem: HJ6 质数因子

题目描述

描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 ) 数据范围: 1n2×109+141≤n≤2×10^9+14

输入描述:

输入一个整数。

输出描述:

按照从小到大的顺序输出它的所有质数的因子,以空格隔开。

示例1

输入:180 输出:2 2 3 3 5

解题思路

将输入的数字开平方根,然后从2开始查找质数

算法流程

  1. 首先创建一个Scanner对象,用于从用户读取输入。
  2. 从用户读取一个长整数,并将其赋值给变量num
  3. 计算num的平方根,并将其赋值给变量k
  4. 从2到k(包括k)开始循环,并检查num是否可被每个数字整除。
  5. 如果num可被当前数字整除,则打印该数字,并将num除以该数字。
  6. 重复步骤5,直到num不再可被当前数字整除。
  7. 循环结束后,检查num是否等于1。如果等于1,表示所有质因数已找到并打印。如果不等于1,表示num本身是一个质数,并将其打印出来。
  8. 程序结束。

代码

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 + " ");
    }

复杂度

  • 时间复杂度:

添加时间复杂度, 示例: O(sqrt(num))O(sqrt(num))

  • 循环从2到k的范围,其中k是num的平方根。因此,循环的次数大约是O(sqrt(num))。
  • 在循环中,每次都检查num是否可被当前数字整除,这需要O(1)的时间。
  • 因此,整个程序的时间复杂度是O(sqrt(num))。
  • 空间复杂度:

添加空间复杂度, 示例: O(1)O(1)

  • 程序只使用了一个Scanner对象来读取输入,这需要O(1)的空间。
  • 因此,整个程序的空间复杂度是O(1)。