-4

每当我给出一个大于 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);
                }
            }
    }
}
4

2 回答 2

4

有几种可能的解释说明您可能会收到错误消息,即数字太大。但问题不在于您提供的代码。

我怀疑问题在于您试图这样调用该main方法:

new q().main(1234567890);

那失败了,因为1234567890int文字,而不是long文字。像这样写:

new q().main(1234567890L);

笔记:

  1. 这适用于 18-19 位数字。除此之外,您将需要使用 BigInteger。
  2. 以这种方式测试素数对于大量数据来说非常缓慢。有很多更有效的方法来做到这一点。读这个,还有这个
  3. 即使您以这种方式测试素数,该prime(a)方法也可以在达到 时停止sqrt(a)。当您发现任何因素(大于 1)时,它应该停止......而不是全部计算。
于 2013-02-04T23:03:52.100 回答
0

我想你会发现,当你开始进行非常大量的迭代(如longs)时,你会想要摆脱for循环并开始使用while循环。

这是你所拥有的:

for(long i = 1; i <= a/2; i++)

但是for循环实际上是用于可数集的。int当循环的迭代数不是 an 时,for您必须更仔细地考虑第二个和第三个参数:

i <= a/2;

a/2一个int?是long吗?是否需要写:

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

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

i++;

您确定++运算符对long值起作用吗?大概。但是你应该检查一下。

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

while(i < someValue)

是一个易于理解的陈述,几乎没有歧义。您将在循环内迭代i(可能是 along或 aBigInteger或其他)while,并减少您真正需要了解该for语句的参数的程度。

您的程序中可能还有另一个问题,很难说出您是如何调用这个类的。但我认为你应该从重写这些循环开始。

于 2013-02-04T23:23:10.983 回答