void CalcNumber(unsigned long number)
{
unsigned long i = 1;
unsigned long prime = 0;
while(i != number)
{
i++;
if(isPrime(i))
{
printf("prime: %lu\n", i);
prime += i;
}
}
Обратите внимание, что вы проверяете примерно вдвое больше чисел, чем нужно.Единственное четное простое число - 2
, поэтому нет смысла проверять что-либо, кроме нечетных чисел, больших или равных 3
, и добавлять 1+2
«вручную».Вы можете также использовать i += 2;
здесь.
Ваш метод isPrime()
пересчитает много информации.То, что на самом деле * получает, использует Сито Эратосфена , чтобы построить таблицу простых чисел, а затем сложить простые числа из , .
* 1016.* Но если вы действительно хотите продолжить с вашим текущим
isPrime()
методом, я бы хотел дать очень сильный намек на то, что вы полностью отбросите переменную
test
и
return
из метода
немедленно когда вы знаете, что число не простое.Это приведет к тому, что код, который будет легче читать
и , будет легче отлаживать.
Подумайте о написании некоторых тестовых примеров, специально проверяющих isPrime()
.Проверьте обычных подозреваемых: 1, 2, 3, 4, 5, 7, 8, 9, 15, 16, 17 и т. Д.