程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

大数的素数分解算法失败

发布于2021-09-15 23:56     阅读(1304)     评论(0)     点赞(7)     收藏(1)


我遇到了 Project Euler 问题 3 的一个奇怪问题。该程序适用于其他较小的数字,例如 13195,但是当我尝试处理像 600851475143 这样的大数字时,它会引发此错误:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at euler3.Euler3.main(Euler3.java:16)

这是我的代码:

    //Number whose prime factors will be determined
    long num = 600851475143L;

    //Declaration of variables
    ArrayList factorsList = new ArrayList();
    ArrayList primeFactorsList = new ArrayList();

    //Generates a list of factors
    for (int i = 2; i < num; i++)
    {
        if (num % i == 0)
        {
            factorsList.add(i);
        }           
    }

    //If the integer(s) in the factorsList are divisable by any number between 1 
    //and the integer itself (non-inclusive), it gets replaced by a zero 
    for (int i = 0; i < factorsList.size(); i++)
    {
        for (int j = 2; j < (Integer) factorsList.get(i); j++)
        {
            if ((Integer) factorsList.get(i) % j == 0)
            {
                factorsList.set(i, 0);
            }
        }
    }

    //Transfers all non-zero numbers into a new list called primeFactorsList
    for (int i = 0; i < factorsList.size(); i++)
    {
        if ((Integer) factorsList.get(i) != 0)
        {
            primeFactorsList.add(factorsList.get(i));
        }
    }

为什么只有大数字会导致此错误?


解决方案


您的代码只是使用Integer,它是一个 32 位类型,最大值为 2147483647。当用于比这大得多的数字时它会失败也就不足为奇了。请注意,您的初始循环int用作循环变量,因此如果它没有抛出异常,实际上将永远循环。的值i将从 2147483647 变为 -2147483648 并继续。

使用BigInteger处理任意大的值,或者Long如果你满意的范围有限,但更大的一个。long/的最大值Long为 9223372036854775807L。)

但是,我怀疑这是否真的是预期的方法……像这样的大数字需要很长时间



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/284227/e1e09258e61079804daf/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

7 0
收藏该文
已收藏

评论内容:(最多支持255个字符)