gpt4 book ai didi

java - java中的递归质因数算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:50:49 25 4
gpt4 key购买 nike

我正在尝试在 java 中实现一个简单的算法来查找通过参数传递的整数的所有素数因子:

private static ArrayList<Integer> lstPrime= new ArrayList<Integer>();

public static ArrayList primeFactors(int n) {

if (isPrime(n))
{
lstPrime.add(n);
}

for (int i=2; i<=(Math.sqrt(n)); i++)
{
if (n % i == 0)
{
lstPrime.addAll(primeFactors(n/i));
return lstPrime;
}
}
return lstPrime;
}

有趣的是,如果我将 81 作为 n 传递,结果将是:3, 3, 3, 3, 3, 3, 3, 3 而它应该是:3, 3, 3, 3 (3^4 =81)

最佳答案

可能有点复杂,但到目前为止它可以正常工作,并且它使用的可能是我能在 Java 中找到的最快(也是最小)的素数生成器。

首先,我们得到素数生成器,需要它来测试一个值是否为素数。我们使用生成器(这个比原始方法快 10 倍)所以我们使用缓存列表:

/**
* Sieve of Sundaram prime number generator
* Implementation following the Sieve of Sundaram to generate prime numbers
*
* @see http://en.wikipedia.org/wiki/Sieve_of_Sundaram
*/
static public class SundaramSievePrimeGenerator {
public String getName() { return "Sieve of Sundaram generator"; }
public int[] findPrimes(int max) {
int n = max/2;
boolean[] isPrime = new boolean[max];

Arrays.fill(isPrime, true);

for (int i=1; i<n; i++) {
for (int j=i; j<=(n-i)/(2*i+1); j++) {
isPrime[i+j+2*i*j] = false;
}
}

int[] primes = new int[max];
int found = 0;
if (max > 2) {
primes[found++] = 2;
}
for (int i=1; i<n; i++) {
if (isPrime[i]) {
primes[found++] = i*2+1;
}
}

return Arrays.copyOf(primes, found);
}
}

然后我们有了实际获取 n 的质因数列表所需的两种方法:

/**
* Reuse an instance of the SundaramSievePrimeGenerator
*/
static public List<Integer> findPrimeFactors(int n, SundaramSievePrimeGenerator g) {
ArrayList<Integer> primeFactors = new ArrayList<Integer>();

int[] primes = g.findPrimes(n+1);
int v;

// debug
//System.out.print("** primes found : ");
//for (int a : primes) {
// System.out.print(" " + a);
//}
//System.out.println();

if (primes[primes.length-1] == n) {
primeFactors.add(n);
} else {

int max = primes.length - 1;

for (int i=max; i>=0; i--) {
primeFactors.add(primes[i]);
if (testPrimeFactor(n, primes[i], primes, i, primeFactors)) {
break; // we found our solution
}
primeFactors.clear();
}
}

return primeFactors;
}

/**
* Recursive method initially called by findPrimeFactors(n, g)
*/
static private boolean testPrimeFactor(int n, int v, int[] primes, int index, List<Integer> factors) {
int v2 = v * primes[index];

if (v2 == n) {
factors.add(primes[index]);
return true;
} else if (v2 > n) {
if (index > 0) {
return testPrimeFactor(n, v, primes, index-1, factors);
} else {
return false;
}
} else {
while (index > 0) {
factors.add(primes[index]);

if (testPrimeFactor(n, v2, primes, index, factors)) {
return true;
}

factors.remove(factors.size()-1); // no good, remove added prime
v2 = v * primes[--index];
}
return false; // at this point, we are still below n... so no good
}
}

最后,我们的测试用例:

int n = 1025;
SundaramSievePrimeGenerator generator = new SundaramSievePrimeGenerator();

List<Integer> factors = findPrimeFactors(n, generator);

if (factors.isEmpty()) {
System.out.println("No prime factors found for " + n);
} else {
System.out.println(n + " is composed of " + factors.size() + " prime factors");
int v = 1;
for (int i : factors) {
v *= i;
System.out.print(" " + i);
}
System.out.println(" = " + v);
}

例如,上面的这段代码将产生:

1025 is composed of 3 prime factors
41 5 5 = 1025

更改n = 81 将产生所需的输出

81 is composed of 4 prime factors
3 3 3 3 = 81

关于java - java中的递归质因数算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4871107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com