我需要创建一个算法。该算法获取一个int并返回一个数组。只要余数为零,就应该对int进行除法。如果它不再可整除,则应该对下一个数字进行同样的处理。(数字为2、3、5 ...都是质数)
这里是我要解释的示例。数:5要返回的数组:{5}
数字:16要返回的数组:{2,2,2,2}
数量:100要返回的数组:{2,2,5,5}
我如何制作一个循环,直到整数不再可以除尽没有余数?
这里是蛮力方法。分解非常大的数据可能非常困难且耗时,并且需要特殊的算法。通过连续除以当前素数来工作,直到余数为非零为止。然后继续下一个素数。
public static List<Integer> factor(int n) {
int save = n;
int[] primes = {2,3,5}; // limited list of primes
List<Integer> factors = new ArrayList<>();
for (int p : primes) {
while (n % p == 0) {
factors.add(p);
n/=p;
}
}
if (n != 1) {
System.out.println("Incomplete factorization for " + save);
}
return factors;
}
由于这是您的家庭作业,我只是给您个主意。您可以尝试实施。注意:非质数至少可被其下的质数整除。
divisible = N
prime = p
loop when (p <= N) {
check the reminder
if reminder == !0 {
increase p
}
if reminder == 0 {
store p
divide N by p;
}
}
所以我想出了下面的代码。但是我不太确定我是怎么想到的,为什么它不起作用....
public static int[] primfaktorzerlegung(int zahl) {
ArrayList<Integer> result = new ArrayList<>(); //ArrayList
int n = zahl;
//n 50
int d = 1;
int[] resultArray = new int[d];
if(n % 2 == 0) {
for (int j = 2; j <= n; j++) {
if (n % j == 0) {
n = n/2;
j++;
result.add(n);
d = d++;
}
}
for (int j = 3; j <= n; j++) {
if (n % j == 0) {
n = n/3;
j++;
result.add(n);
d = d++;
}
}
for (int j = 5; j <= n; j++) {
if (n % j == 0) {
n = n/5;
j++;
result.add(n);
d = d++;
}
}
for (int j = 7; j <= n; j++) {
if (n % j == 0) {
n = n/7;
j++;
result.add(n);
d = d++;
}
}
for (int j = 9; j <= n; j++) {
if (n % j == 0) {
n = n/9;
j++;
result.add(n);
d = d++;
}
}
for (int j = 11; j <= n; j++) {
if (n % j == 0) {
n = n/11;
j++;
result.add(n);
d = d++;
}
}
}
return resultArray;
尝试使用此函数将计算数字的质数。
public static void main(String[] args) {
System.out.println("Factors for 5: " + calculatePrimeFactors(5)); // [5]
System.out.println("Factors for 16: " + calculatePrimeFactors(16)); // [2, 2, 2, 2]
System.out.println("Factors for 100: " + calculatePrimeFactors(100)); // [2, 2, 5, 5]
}
public static List<Integer> calculatePrimeFactors(int number) {
// Create empty factors list
List<Integer> factors = new ArrayList<Integer>();
// For factor 2; while factor is smaller than the passed number; increase factor
for(int factor = 2; factor <= number; factor++) {
// While number % factor equals 0 (fully dividable without rest); add factor and divide number by factor
while(number % factor == 0) {
factors.add(factor);
number = number / factor;
}
}
return factors;
}