В вашем коде есть две ошибки:
В вашей функции prime()
вы не проверяете x
на значение 2
, которое также будет простым числом.
Вторая ошибка - ;
после оператора for
.
for(b=2;b<(a+1)/2;b++);
Удалите его, в противном случае следующий блок (часть между {
и }
) выполняется не для каждой итерации цикла, а только после его окончания.
Обычно вы не хотите читать число с плавающей точкой, вам нужно целое число. Используйте fgets()
и atoi()
для вашего случая использования. Это намного безопаснее, чем scanf()
.
В качестве последнего пункта: добавьте пробелы до и после операторов. Это делает код намного более читабельным.
полный код
#include <stdio.h>
#include <stdlib.h>
int prime(int x)
{
int i;
if (x == 2)
{
return 1;
}
for (i = 2; i < x; i++)
{
if (x % i == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int read_number;
int summand1;
int summand2;
int count = 0;
int max;
char buffer[100];
printf("Enter Number\n");
fgets(buffer, sizeof(buffer), stdin);
read_number = atoi(buffer);
max = (read_number + 1) / 2;
for (summand1 = 2; summand1 < max; ++summand1)
{
summand2 = read_number - summand1;
if ((prime(summand1) == 1) && (prime(summand2) == 1))
{
printf("%d = %d + %d\n", read_number, summand1, summand2);
count++;
}
}
if (count == 0)
{
printf("%d cannot be expressed as sum of two prime numbers.\n", read_number);
}
return 0;
}
Конечно, вы могли бы сделать некоторые оптимизации. Например, в prime()
: если вы уже проверили, что x
не кратно 2
, вы можете начать цикл с 3
и увеличить i
на 2
в самой итерации. Или вы можете остановить этот цикл, если i
больше квадратного корня из x
. Эти меры могут ускорить ваш код для больших чисел, но это может сделать код менее читабельным. Об этом нужно помнить, особенно если вы начинаете изучать программирование.