【问题标题】:Division By Zero Error For Project Euler?欧拉项目的零误差除法?
【发布时间】:2013-12-17 21:02:58
【问题描述】:

我正在尝试解决一些项目欧拉问题,无论出于何种原因,每当我尝试使用大量数字运行它时,以下代码都会给我一个除以零的错误。谁能告诉我为什么?

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;
            }
        }
    }
}

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

【问题讨论】:

  • “...有大量数字”。听起来你已经超出了int 的容量。
  • numlong,但 i 只是 int。所以如果num 大于最大整数,i++ 最终会溢出。我猜它最终会达到 0,因此num % i 将引发除以零错误。
  • 谢谢!我不敢相信这么简单的事情就这么溜走了。
  • 你见过这个算法sieve of eratosthenes,因为你已经知道你的限制可能有用

标签: java divide-by-zero


【解决方案1】:

int 溢出了。在循环 for(int i = 2; i &lt; num; i++) 中,num 是一个 long 而 i 只是一个 int。当i 达到它的容量时,它会回绕到 -2,147,483,648 并继续递增,直到它达到 0,此时您会收到错误。

【讨论】:

  • woz,我正在使用数字在 long 范围内的代码,但它仍然给我一个除以零的错误。
  • 即使你在一个long的范围内,当你做for(int i = 2; i &lt; num; i++)时,i可以和num一样大,而i只是一个int
  • "任何大于该值的数字都可能给你一个错误" -> 不一定,这会溢出到 -2,147,483,648 并一直持续到 0,它会出错。
【解决方案2】:

其他回复已经指出了您的错误。让我给你一个更好的算法来使用试除法分解一个复合整数。基本思想是简单地遍历可能的因素,每次找到一个时减少 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2014-03-08
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多