2 回答
TA贡献1111条经验 获得超0个赞
AKS 素性测试的实现仅限于使用 32 位数据类型,它可以存储最多2,147,483,647. 你的号码比那个大很多,所以没有正确阅读。
听起来很容易解决,我们应该能够将所有出现的int,更改为,long因为long数据类型可以存储非常大的数字。不幸的是,这行不通,因为我们仍然受到 Java 中 32 位数组的最大大小的限制。因此,不深入研究不安全的内存访问是非常不切实际的。
如果要检查大数字的素数,可以像这样修改代码:
替换main为:
public static void main(String[] args)
{
AKSPrime p = new AKSPrime();
TextReader k = new TextReader();
System.out.print("Input number for primality testing: ");
long i = k.readLong();
System.out.println("Is " + i + " prime? " + p.nonAKSisPrime(i));
}
用这个替换nonAKSisPrime函数:
private boolean nonAKSisPrime(long x)
{
long f = 2;
boolean result = true;
long s = (long)Math.sqrt(x);
while(f <= s && result)
{
if(x % f == 0)
result = false;
f++;
}
return result;
}
并将这个新函数添加到TextReader,读取long值:
public long readLong()
{
long result = 0;
do // keep on trying until a valid long is entered
{
try
{
result = Long.parseLong(readWord());
break; // result is good, jump out of loop down to return result;
}
catch (Exception e)
{
if(rePrompting)
System.out.println("Invalid long. Try again.");
else
{
error( "readLong" );
break;
}
}
} while( true );
return result;
}
TA贡献1775条经验 获得超11个赞
恐怕您的意思是 16字节整数,而不是bit。一个javaint
是4字节32位,一个long
8字节64位。
1425412525412545
可能适合 long,当然不是 int,也许您BigInteger
原则上应该使用来覆盖完整的 16 个字节。
由于这不再是原始类型,因此需要更多的编写。
添加回答
举报