'isprime ()' не работает, но сейчас я часто использую эту функцию, но почему она не работает?
void isprime (int n)
-> Возвращение void
из простого теста не имеет смысла. это фатальный недостаток дизайна.
Поскольку isprime(int n)
имеет return 0;
до void isprime (int n)
функции. Фатальная ошибка. Это должно вызвать предупреждение с хорошо включенным компилятором. Включить все предупреждения, чтобы сэкономить время.
if ((fmod(n, m)) == 0)
не имеет смысла с int
аргументами n,m
. Я бы ожидал if (n%m == 0)
. Преобразование в плавающую точку здесь крайне неэффективно и часто некорректно в качестве основного теста, когда точность int
превышает double
.
Диапазон
int
часто недостаточен для значений в диапазоне 4 миллиардов. Рекомендуйте самый широкий тип без знака . Для обработки 9872349901
используйте unsigned long long
или uintmax_t
. @ Фред Ларсон
for (m = 2; m <= n - 1; m++)
мучительно медленно для больших не простых n
. Итерация только до квадратного корня: когда частное превышает делитель.
isprime(0)
и isprime(1)
возвращают неверный результат.
Alternate
int isprime(unsigned long long n) {
unsigned long long m;
for (m = 2; m <= n/m; m++) {
if (n%m == 0) {
return false;
}
}
return n > 1;
}
Многие оптимизации производительности возможны для isprime()
. Тест на первичность