Проблема в том, что ваш тестовый пример '9872349871' слишком велик для размещения в int (в вашей реализации / машине).
Простое исправление заключается в следующем (изменил все на long, использовал strtol для обнаружения проблем вне диапазона ):
РЕДАКТИРОВАТЬ: В зависимости от вашего компилятора, long может быть недостаточно большим для вашего образца ввода. long long действительно гарантированно будет 8 байтов, но будет работать только на компиляторах, которые хотя бы поддерживают C99.
Действительно важная часть - это проверка вашего входного значения! В противном случае ваш код не на один бит безопаснее, чем раньше.
char *end;
long n = strtol(argv[1], &end, 10);
if(errno == ERANGE){
printf("The number you entered is too large!\n");
return -1;
}
Полный код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
//OK, so this is a sloppy, inefficient implementation.
/*
int isprime(long n) {
for (long i = 2; i != n; ++i)
if (n%i == 0)
return 0;
return 1;
} */
// A better one:
int isprime(long n) {
if(n <= 3)
return n >= 2;
if(n%2 == 0)
return 0;
for (long i = 3; i <= sqrt(n); i += 2)
if (n%i == 0)
return 0;
return 1;
}
int main (int argc, char *argv[])
{
if (argc < 2)
{
printf ("Usage: p4 <number>\n");
return -1;
}
char *end;
long n = strtol(argv[1], &end, 10);
if(errno == ERANGE){
printf("The number you entered is too large!\n");
return -1;
}
if (n < 2)
{
printf ("input number should be > 1\n");
return -1;
}
int result = isprime(n);
if (result == 1)
printf ("%ld is prime\n", n);
else
printf ("%ld is not prime\n", n);
return 0;
}