【问题标题】:Find the number that has 4 distinct prime factors找出具有 4 个不同质因数的数
【发布时间】:2019-07-01 16:15:24
【问题描述】:

从用户那里获取数字 n。然后打印具有至少 4 个不同质因数的第 n 个数字。例如(210 个素因子(2,3,5,7))210 是第一个具有 4 个不同素因子的数字,下一个数字是 330(2,3,5,11)。 输入:2 输出:330 和输入:3 输出:390。我不知道该怎么做?我试图找到一个数字的质因数。

 for (int i = 2; i <= number; i++) {
     while (number % i == 0) {
        System.out.print(i + " ");
        number = number / i;
     }
 }
 if (number < 1) 
     System.out.println(number);

但我想打印具有 4 个不同质因数的第 n 个数字。

【问题讨论】:

标签: java prime-factoring


【解决方案1】:

您可以使用以下代码:

public static boolean findPrimeFactors(int n) {
    Set<Integer> primeFactorSet = new HashSet<>();
    while (n % 2 == 0) {
        // here number is even so adding 2
        primeFactorSet.add(2);
        n /= 2;
    }

    // number would be odd in this loop
    for (int i = 3; i <= Math.sqrt(n); i += 2) {
        while (n % i == 0) {
            primeFactorSet.add(i);
            n /= i;
        }
    }

    if (n > 2) {
        primeFactorSet.add(n);
    }

    // true if the unique prime-factors are greater than or equal to 4
    return primeFactorSet.size() >= 4 ? true : false;
}

现在调用它:

public static void main(String[] args) {
    List<Integer> primeFactorList = new ArrayList<Integer>();
    // accept this from user
    int n = 2;

    for (int i = 210;; i++) {
        // find prime factors for each number
        if (findPrimeFactors(i)) {
            primeFactorList.add(i);
        }
        if (primeFactorList.size() == n) {
            System.out.println(primeFactorList.get(n - 1));
            break;
        }
    }
}

解释:

  1. 循环从 210 迭代到具有四个或更多的第 n 个数字 不同的主要因素。
  2. 对于每个满足条件的数字,该方法返回 true,否则返回 false。
  3. 接下来检查列表的大小是否等于 用户输入的号码 (n)。如果它等于n-1th 获取索引并退出循环。

【讨论】:

  • 在奇数 for 循环中使用 i
  • 因为它可以防止重复分割。考虑100/ 5 = 20。然后查看100 is divisible by 20 是没有意义的,因为它自5 * 20 == 100 以来已经遇到过。所以超越平方根是没有意义的。
  • @Harini:每个合数都有一个小于平方根的素数,循环只关心最小的。见math.stackexchange.com/questions/63276
  • 实际上 sqrt() 方法很昂贵,只有在 n 改变时才应该再次调用。但是我测试过,似乎编译器在这种情况下会自动进行此优化。
【解决方案2】:

上述方法的一个问题是它除以所有奇数,直到候选的平方根。最好除以先前累积的素数。这很容易做到,如下所示:

      List<Integer> primes = new ArrayList<>(List.of(2));
      outer:
      for (int i = 3; i < n; i++) {
         int end = (int)Math.sqrt(i);
         for (int k = 0, p = primes.get(0); p <= end; p =
               primes.get(k++)) {
            if (i % p == 0) {
               continue outer;
            }
         }
         primes.add(i);
      }

并将平方根计算移出循环。每个周期都会对其进行评估。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2020-07-29
    • 2018-03-31
    相关资源
    最近更新 更多