发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!