Ваша функция DividerIsPrime
, как написано в данный момент, имеет дефект, который по логике должен всегда возвращать True
.
Причина этого в том, что статус меняется на каждой итерации. Даже если будет достигнуто status=False
(число является составным, поскольку модуль делителя равен нулю для делителя), итерации будут продолжаться, и в каждом случае status=True
будет достигнуто на последней итерации, когда divider == (данные - 1) .
Вы можете изменить это следующим образом:
/* Check if this number is a prime number */
char DividerIsPrime(unsigned long data)
{
unsigned long divider;
for(divider=2;divider<data;divider++)
{
if (0==(data % divider))
return False;
}
return True;
}
Вы бы нашли это с помощью некоторого «модульного теста», такого как:
assert(DividerIsPrime(5));
assert(!DividerIsPrime(6)); /* This test would fail without corrected code. */
Очевидно, что есть гораздо более эффективные алгоритмы для "проверки простоты".