【发布时间】:2013-11-03 23:57:47
【问题描述】:
我编写了一个函数来使用 Eratosthenes 筛法处理素数。该函数使用整数可以正常工作,但我现在正在尝试实现对 long 的支持,以便可以处理大数。
我似乎无法让函数与 long 一起使用,也看不出明显的原因。
错误是指来自类型转换等的典型精度警告,但我无法弄清楚是什么原因造成的:
./com/wkilgour/lang/Maths.java:21: error: possible loss of precision
boolean[] isPrime = new boolean[n + 1];
^
required: int
found: long
./com/wkilgour/lang/Maths.java:24: error: possible loss of precision
isPrime[i] = true;
^
required: int
found: long
./com/wkilgour/lang/Maths.java:27: error: possible loss of precision
if (isPrime[i])
^
required: int
found: long
./com/wkilgour/lang/Maths.java:29: error: possible loss of precision
isPrime[i * j] = false;
^
required: int
found: long
4 errors
函数如下:
public static boolean[] primeSieve(long n)
{
boolean[] isPrime = new boolean[n + 1];
for (long i = 2L; i <= n; i++)
isPrime[i] = true;
for (long i = 2L; i*i <= n; i++)
if (isPrime[i])
for (long j = i; i*j <= n; j++)
isPrime[i * j] = false;
return isPrime;
}
任何帮助将不胜感激!
【问题讨论】:
-
你的错误信息是不是有点长?
-
是的,有一些与精度有关的错误。我现在添加了完整的错误
-
您是否考虑过需要多少内存才能知道高达
long值的数字的素数? -
使用分段筛子,将筛子分成更小的部分。 stackoverflow.com/questions/10249378/…
标签: java types long-integer primes sieve