方法1:试除法

869. 试除法求约数

给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。
输入格式
第一行包含整数 n。
接下来 n行,每行包含一个整数 ai。
输出格式
输出共 n行,其中第 i行输出第 i 个整数 ai 的所有约数。
数据范围
1≤n≤100
2≤ai≤2×109
输入样例:

  1. 2
  2. 6
  3. 8

输出样例:

  1. 1 2 3 6
  2. 1 2 4 8

思路:

类似与质数判定
时间复杂度: O(sqrt(n))

  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. int n = sc.nextInt();
  6. while (n-- > 0) {
  7. int a = sc.nextInt();
  8. //核心
  9. List<Integer> res = new ArrayList<>();
  10. for (int i = 1; i <= a / i; i++) {
  11. if (a % i == 0) {
  12. res.add(i);
  13. if (i != a / i) res.add(a / i);
  14. }
  15. }
  16. Collections.sort(res);
  17. for (int i : res) {
  18. System.out.print(i + " ");
  19. }
  20. System.out.println();
  21. }
  22. }
  23. }

方法2:算数基本定理 + 枚举

思路:

先对x进行质因数分解,然后枚举它所有的约数

  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. int T = sc.nextInt();
  6. while (T-- > 0) {
  7. int n = sc.nextInt();
  8. List<Integer> res = new ArrayList<>();
  9. for (int i = 1; i <= n / i; i++) {
  10. if (n % i == 0) {
  11. res.add(i);
  12. if (n / i != i)
  13. res.add(n / i);
  14. }
  15. }
  16. Collections.sort(res);
  17. for (int i = 0; i < res.size(); i++)
  18. System.out.print(res.get(i) + " ");
  19. System.out.println();
  20. }
  21. }
  22. }