繁体   English   中英

Java 中的因素

[英]Factors In Java

我正在尝试计算 n 的阶乘的质因子列表,其中质因子按升序排序,并且该列表中的每个因子与它在阶乘的质因子分解中出现的次数一样多。

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

比方说,你已经计算所有质数从[第2..N],并让称这组P,那么对于每个p P中,你可以从[第2..N]每个数nn检查多少次p整除并将其放入链表。 如果您对 MT756 在上面的评论中所说的多一点思考,您可以使我所说的算法更快一点。 我没有把 java 代码放在让你觉得这个任务有点有趣的地方。 :)

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

您还应该有一个方法来计算一个数的素因数并将其作为列表返回。 您传入从 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));
    }
}

这是另一种方式。 它包括多项检查,以确保进行不必要的测试,以便尽快退出循环。 如果想要在 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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM