Объясните, почему не проходит проверка на простое число? - C (СИ)
Формулировка задачи:
Здравствуйте.
Есть код программы.
Должна читать текстовый файл и сортировать слова примерно так. +проверка на палиндромы.
Number - только целые неотрицательные числа в пределах от 0 до INT_MAX
Текст в файле:
Hello worlds. Contains 2 words and 1 space.
word : Hello
word : World.
word: Contains
prime number: 2
word: words
word: and
number: 1
word: space.
Получился код:
Объясните почему не проходит проверка на простое число и что я делаю не так.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <limits.h>
int main(void)
{
char buffer[100];
while((scanf("%s", buffer)!= EOF))
{
if(number(buffer))
printf("number: %s\n", buffer);
else if(palindrome(buffer))
printf("palindrome: %s\n", buffer);
else if(date(buffer))
printf("date: %s\n", buffer);
else
printf("word: %s\n", buffer);
}
getchar();
return 0;
}
int number(char buffer[])
{
int place = 0;
bool number = true;
while(buffer[place] != '\0')
{
if(isdigit(buffer[place]))
{
place++;
continue;
}
else
{
number = false;
break;
}
}
if(number)
return 1;
else
return 0;
}
int palindrome(char buffer[])
{
char *start = buffer,*end;
while (*buffer)
{
end = buffer;
buffer++;
}
while (end >= start)
{
if (*end!=*start)
return 0;
end--;
start++;
}
return 1;
}
int date(char buffer[])
{
return 0;
}
int prime(char buffer[])
{
int z;
int isprime = 0;
unsigned int i = *buffer;
i = atoi(buffer);
if( i < 0 || i > INT_MAX)
return 0;
else
{
for(z = 2; z < i/2 ; z++)
{
if((i % z)==0)
{
isprime = 1;
break;
}
}
if(isprime == 0)
return 1;
else
return 0;
}
return 0;
}Решение задачи: «Объясните, почему не проходит проверка на простое число?»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <limits.h>
int palindrome(char buffer[])
{
char *start=buffer,*end;
while (*buffer)
{
end=buffer; buffer++;
}
while (end>=start)
{
if (*end!=*start)
return 0;
end--;
start++;
}
return 1;
}
int main(void)
{
char buffer[100];
while((scanf("%s", buffer)!= EOF))
{
int is_number=0;
int rez = atoi(buffer);
if(rez)is_number=1;
else
{
if((buffer[0] == '0') && (!buffer[1]))is_number=1;
}
if(is_number)
{
printf("%snumber: %d\r\n", prime(rez) ? "prime ":"",rez);
}
else
{
if(palindrome(buffer))
printf("palindrome %s",buffer);
else
printf("word %s",buffer);
}
}
getchar();
return 0;
}
Объяснение кода листинга программы
- В начале кода объявлены функции
palindromeиmain, а также включены необходимые заголовочные файлы. - Функция
palindromeпринимает на вход строкуbufferи проверяет ее на простоту, сравнивая символы с начала и конца строки. Если они не совпадают, то функция возвращает0, иначе1. - В функции
mainсоздается буферbufferразмером 100 символов для считывания входных данных. - В цикле
whileсчитываются строки с помощьюscanf, до тех пор, пока не будет достигнут конец файла. - Для каждой считанной строки создается переменная
is_number, которая инициализируется как0. Переменнаяrezсчитывается как целое число с помощьюatoi. - Если
rezбольше0, тоis_numberустанавливается в1. Еслиrezравно0, то проверяется второй символ. Если он равен0, тоis_numberустанавливается в1. - Если
is_numberравно1, то выводится сообщение о том, является ли число простым с помощью функцииprimeи само число. - Если
is_numberравно0, то проверяется, является ли строка палиндромом с помощью функцииpalindrome. Если да, то выводится сообщениеpalindrome. Если нет, то выводится сообщениеword. - В конце функции
mainвызываетсяgetcharдля считывания символа новой строки, а затем функция возвращает0.