我正在尝试解决一些项目Euler问题,无论出于何种原因,每当我尝试使用大数字运行时,以下代码都会给我一个除零错误。谁能告诉我为什么?
import java.util.Scanner;
public class Problem3LargestPrimeFactor {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter the number to find the largest prime factor for.");
long num = input.nextLong();
int largest = 1;
boolean isPrime = true;
for(int i = 2; i < num; i++) {
if(num % i == 0) {
for(int u = 2; u < i; u++){
if(i % u == 0)
isPrime = false;
}
if(isPrime)
largest = i;
}
}
}
}
现在我知道这不是设计算法的最有效方法,但有人能告诉我这里发生了什么吗?
答案 0 :(得分:0)
你满溢int
。在循环for(int i = 2; i < num; i++)
中,num
为长,i
仅为int
。当i
达到它的容量时,它会回绕到-2,147,483,648并继续递增直到它变为0,此时你会得到错误。
答案 1 :(得分:0)
其他回复已经指出了您的错误。让我给你一个更好的算法,用于使用试验分割来计算复合整数。基本思想是简单地遍历可能的因素,每次找到时减少 n 。这是伪代码:
function factors(n)
f, fs := 2, {}
while f * f <= n
while n % f == 0
append f to fs
n := n / f
f := f + 1
if n > 1
append n to fs
return fs
如果您对使用素数编程感兴趣,我会在我的博客上谦虚地推荐this essay。