将void算法转换为int []

时间:2017-02-10 06:04:44

标签: java arrays optimization

所以我有一个程序可以找到一个数字的素数因子分解。

public static void primeFactors(int number){
	int i=2;
	while(number>1){
		if (number%i==0){
		System.out.println(i);

			number/=i ;
		}else{
			i++;
			if(isPrime(i)==true){
						System.out.println(i);

				number/=i;
			}else{
				i++;
}}}}

但问题是我希望它作为一个数组返回。并且它必须能够占用大量并在5秒内运行。所以我将工作算法转换为:

public static int[] primeFactors2(int number){
	int[] arrayINT =new int[10];
    int i = 2;
    int index=0;
    while(i<=number/2){
        if(number %i==0 && isPrime(i)){
           arrayINT[index]=i;
           index++;
        }
        i++;
    }
    return arrayINT;
}}

这并没有返回正确的结果,并且速度效率也不高。我到底做错了什么!

这是isPrime():

	 public static boolean isPrime(int number){
                if (number<2){
                        return false;
                }
                if (number==2){
                        return true;
                }
                if (number%2==0){
                        return false;
                }
                int ceiling=number; 
                for(int i=3;number>i&&ceiling>i;i+=2){   
                        if(number%i==0){
                                return false;
                        }
                        ceiling=number/i;   
              }  return true;
        }

1 个答案:

答案 0 :(得分:0)

我已经修改了一些代码以满足您的要求。请看一下。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

-

public static void main(String[] args) {
    primeFactors(630);
    System.out.println(Arrays.toString(primeFactors2(630)));

}

public static void primeFactors(int number) {
    int i = 2;
    int init = number;
    while(i<=init/2){
        if(number %i==0 && isPrime(i)){
            System.out.println(i);
            number/=i;
            i--;
        }
        i++;
    }
}

public static Integer[] primeFactors2(int number) {
    List<Integer> list = new ArrayList<>();
    int i = 2;
    int init = number;
    while(i<=init/2){
        if(number %i==0 && isPrime(i)){
            list.add(i);
            number/=i;
            i--;
        }
        i++;
    }
    return list.toArray(new Integer[list.size()]);
}

public static boolean isPrime(int number) {
    if (number < 2) {
        return false;
    }
    if (number == 2) {
        return true;
    }
    if (number % 2 == 0) {
        return false;
    }
    int ceiling = number;
    for (int i = 3; number > i && ceiling > i; i += 2) {
        if (number % i == 0) {
            return false;
        }
        ceiling = number / i;
    }
    return true;
}