Я испытываю странную проблему и ужасно отлаживаю ее.Я думал, что опубликую это здесь, чтобы получить какие-либо мнения.
public static void sieve(int limit) {
for (int i = 2; i < limit; i ++) {
if (mPrimes[i] == true) {
for (int j = i*i; ((j < limit) && (j > 0)); j += i) {
mPrimes[j] = false;
}
}
}
}
(предположим, что изначально все mPrimes верны)
Вот подвох:
Когда я запускаю этоПрограмма с ограничениями 10, 100, 1000, 10000 и даже 100000, сообщает о подсчете правильного числа простых чисел ниже заданного числа, как перекрестно ссылается эта страница: http://primes.utm.edu/howmany.shtml
Однако, когда язапустить с аргументом 1000000 (один миллион), я получаю результат, который ровно на 7 от правильного значения (он сообщает 78491 вместо 78498).
Более того, все другие методы подсчета простых чисел, которые я реализовал в этой программе, сообщают правильное значение.
И вот реальная выгода: если я заменим
i*i
с
i+i
Что касается «вычеркивания» непосредственно из начального значения, вместо того, чтобы начинать с квадрата (что и сделал мой профессор в своем примере кода), это работает.
Мне остается только предположить, что с квадратом происходит что-то странное, когда я очень большой.
Есть предложения?