我有找到素数除数的值的函数。 (http://www.calculatorsoup.com/calculators/math/prime-factors.php)
例如它需要12并产生2 * 2 * 3 = 2,3如果它需要10它会产生2 * 5 = 2,5就像那样
我的代码如下:
public List<Integer> findPrimeDivisor(int value) {
ArrayList<Integer> divisors = new ArrayList<>();
int startPoint = 2;
if (isRound(value, startPoint)) {
divisors.add(startPoint);
}
while (value != 1) {
if (isRound(value, startPoint)) {
value /= startPoint;
continue;
}
startPoint++;
divisors.add(startPoint);
}
return divisors;
}
private boolean isRound(int value, int roundBy) {
return (value % roundBy) == 0 ? true : false;
}
我怎样才能更有效地做到这一点?感谢您的建议:)
答案 0 :(得分:1)
您的素数除数计算器由于多种原因而无法正常工作,因此尝试直接改进它是不合逻辑的。以下是一些原因:
如果您正在寻找一种方法来找到它们,您可以使用众多可用库中的一个,但如果您想开始制作自己的库,我建议您从小处开始将问题分成几部分:
一个例子可能是:
public static void main(String[] args)
{
System.out.println(findPrimeDivisors(25));
System.out.println(findPrimeDivisors(12));
System.out.println(findPrimeDivisors(10));
System.out.println(findPrimeDivisors(50));
}
// Should be cached or maybe even hardcoded to a point
public static boolean isPrime(int number)
{
for(int i = 2; i <= number/2; i++)
if(number % i == 0)
return false;
return true;
}
// Main loopbreaker, decides whether the next candidate should be tried or not, can be more efficient
public static boolean tryNext(int candidate, int value)
{
return value / candidate >= 2;
}
public static List<Integer> findPrimeDivisors(int value)
{
List<Integer> resultList = new ArrayList<Integer>();
int candidate = 2;
while(tryNext(candidate,value))
{
if(isPrime(candidate) && (value % candidate == 0)) resultList.add(candidate);
candidate++;
}
return resultList;
}