Прайм или не прайм от Interger в функции - PullRequest
0 голосов
/ 01 ноября 2018

Я не понимаю, почему он не выводит то, что должен. Я повторил это три раза, но он не выдает должным образом, если int простое число или нет.

/**
 * Make a function called isprime that returns true (i.e. 1) if the integer
 * number passed to it is prime and false (i.e. 0) if it is composite (i.e.
 * not prime.)  A number is composite if it is divisible by 2 or any odd number
 * up to the square root of the number itself, otherwise it is prime.
 * Hint: n is divisible by m if (n % m == 0)
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

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;
}

/**
 * Using the isprime function you made above, test if a number provided on the
 * command line is prime or not. The program should print a usage message if no
 * number is provided ("Usage: p4 <number>\n") and print a warning if the number
 * is less than 2 ("input number should be > 1\n") and should be able to handle
 * numbers greater than 4 billion.
 *
 * Example input/output:
 * ./p4 9872349901
 * 9872349901 is prime
 * ./p4 65
 * 65 is not prime
 */

int main (int argc, char *argv[])
{
  int n;
  int result;

  if (argc < 2)
    {
      printf ("Usage: p4 <number>\n");
    }
  n = atoi (argv[1]);

  if (n < 2)
    {
      printf ("input number should be > 1\n");
    }
  result = isprime (n);

  if (result == 1)
    printf ("%d is prime\n", n);
  else
    printf ("%d is not prime\n", n);
  return 0;
}

ОБНОВЛЕНО

После проверки компиляции:

> p4:
> Output of program (p4) is not correct for input '9872349871':
> ------ Yours: ------ 
> 1282415279 is not prime
> ---- Reference: ---- 
> 9872349871 is not prime
> --------------------

1 Ответ

0 голосов
/ 01 ноября 2018

'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(). Тест на первичность

...