项目欧拉的零误差划分?

时间:2013-12-17 21:02:58

标签: java divide-by-zero

我正在尝试解决一些项目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;
            }
        }
    }
}

现在我知道这不是设计算法的最有效方法,但有人能告诉我这里发生了什么吗?

2 个答案:

答案 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