如果给出大于11位或更大的数字,则java中的素数因子分解出错

时间:2013-02-04 22:51:12

标签: java

每当我提供一个大于10位的数字时,即使我在任何地方都使用过Error:Integer too large数据类型,它也会显示错误long

这是我的计划:

class q3 {
    boolean prime(long a) {
        long c=0;
        for(long i=1;i<=a;i++) {
            if(a%i==0) {
                c++;
            }
        }
        if(c==2) {
            return true;
        } else {
            return false;
        }
    }

    public void main(long a) { 
        boolean result=false;
            for(long i=1;i<=a/2;i++) {
                if(a%i==0) {
                    result=prime(i);
                } else {
                    result=false;
                }
                if(result==true) {
                    System.out.println(i);
                }
            }
    }
}

2 个答案:

答案 0 :(得分:4)

有几种可能的解释,说明如何判断数字太大可能会出错。但问题不在于您提供的代码中。

我怀疑问题是你试图像这样调用main方法:

new q().main(1234567890);

失败,因为1234567890int字面值,而不是long字面值。写得像这样:

new q().main(1234567890L);

注意:

  1. 这适用于18-19位数字。除此之外,您还需要使用BigInteger。
  2. 对于大数字来说,测试素数非常慢。有更有效的方法。阅读thisthis
  3. 即使您以这种方式测试素数,prime(a)方法也会在到达sqrt(a)时停止。当你发现任何因素(大于1)时,停止...而不是全部计算。

答案 1 :(得分:0)

我想你会发现当你开始进行大量的迭代(比如long s)时,你会想要摆脱for循环并开始使用{{ 1}}循环。

以下是你所拥有的:

while

但是for(long i = 1; i <= a/2; i++) 循环真正意味着可数集。当你有for以外的东西作为int循环的迭代时,你必须更仔细地考虑第二和第三个参数:

for

i <= a/2; a/2吗?是int吗?你需要写:

long

突然间,这变得更加复杂。当你写:

i <= ((long) a)/2L;

您是否确定i++; 运算符适用于++值?大概。但是你应该检查一下。

通常,严肃的数学模型/计算使用long循环,因为:

while

是一个易于理解的陈述,几乎没有含糊之处。您将在while(i < someValue) 循环内迭代i(可能是longBigInteger或其他任何内容),并减少您对参数的真正理解程度那个while陈述。

你的程序可能有另一个问题,很难说你是如​​何打电话给这门课程的。但我认为你应该从重新编写这些循环开始。