【问题标题】:Factors In JavaJava中的因素
【发布时间】:2020-06-24 14:27:51
【问题描述】:

我正在尝试计算 n 的阶乘的素因数列表,其中素因数按升序排序,并且此列表中的每个因数与它在阶乘的素因数分解中出现的次数完全相同。

我有一个程序可以计算素数的链表,直到指定的数字,但我不确定如何在将当前正乘以的整数的素数因子附加到阶乘中时实现它:

【问题讨论】:

  • 在方法 checkPrime 中,您希望 for 循环中的测试条件为 i*i <= number; 复合数可以是素数的平方。

标签: java primes factorial prime-factoring


【解决方案1】:

假设你已经计算了 [2..N] 中的所有素数,并称这个集合为 P,然后对每个 p > 在 P 中,您可以从 [2..N] 中获取每个数字 n 并检查 p 的次数将 n 分开,放到链表上。如果您对 MT756 在上面的评论中所说的内容多加思考,您可以使我所说的算法更快一点。我没有放 java 代码来让这个任务对你来说有点有趣。 :)

【讨论】:

    【解决方案2】:
    public static List<Integer> getFactorialPrimeFactors(int n)
    {
        List <Integer> primes = primeNum(n);
    
        ArrayList <Integer> primeDivisors = new ArrayList<>();
        for(int i: primes)
        {
            int count = 0;
            for(int num = i; num <= n; num *= i)
            {
                count += n/num;
            }
    
            while(count > 0)
            {
                primeDivisors.add(i);
                count--;
            }
        }
    
        return primeDivisors;
    }
    

    解释-https://math.stackexchange.com/a/642220

    【讨论】:

      【解决方案3】:

      你还应该有一个方法来计算一个数的质因数并将它作为一个列表返回。您传入从 primeNum 获得的素数列表,它会返回最多为一个数字的素数列表。

      public static List<Integer> primeFactors(int number, List<Integer> primes) {
          List<Integer> ans = new ArrayList<>();
          // test condition includes number >= primes.get(i)
          // so the loop exits when the current prime is greater than the number
          for(int i = 0; i < primes.size() && number >= primes.get(i); i++){
              while(number % primes.get(i) == 0){
                  ans.add(primes.get(i));
                  number = number / primes.get(i);
              }
          }
          return ans;
      }
      

      然后在您的 main 方法中,您可以编写一个 forloop 遍历从 1 到 n 的所有数字,并在每个循环中调用此 primeFactors 方法。您通过调用此方法获得的结果进行迭代,并将这些素数添加到列表中。最后,如果您希望数字按顺序排列,您可以对列表进行排序。

      List<Integer> primes = primeNum(n);
      for(int i = 1; i <= 10; i ++){
          List<Integer> temp = primeFactors(i,primes);
          for(int j = 0; j < temp.size(); j++){
              list.add(temp.get(j));
          }
      }
      

      【讨论】:

        【解决方案4】:

        这是另一种方式。它包括几项检查以确保不必要的测试,以便尽快退出循环。如果想要在 N 阶乘末尾找到 0 的数量,它的工作方式相同。为此,只需将N 除以 5 的连续幂的商相加(因为 5 是 10 的较大因数)。

        这是通过不断除以每个素数将 N 的商相加来实现的。

            public static List<Integer> getNFactorialFactors(int n, List<Integer> primes) {
                List<Integer> factors = new ArrayList<>();
                int nn = n;
                for (int p : primes) {
                    while (nn > 1) {
                        for (int i = nn / p; i > 0; i--) {
                            factors.add(p);
                        }
                        nn /= p;
                    }
                    nn = n;
                }
        
                return factors;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          相关资源
          最近更新 更多