Twoja pętla jest niepoprawna, gdyż 2 razy sprawdzasz warunek, który tam jest. Jak chcesz się bawić w "dosłowne" tłumaczenie to najlepiej użyć goto
(o zgrozo), przykład
#include <stdio.h>
#define loop while (1)
int main() {
int n, i = 0;
scanf("%d", &n);
loop:
if (n == i) goto prime;
if (n % i == 0) goto not_prime;
i += 1;
goto loop;
prime:
puts("true");
goto end;
not_prime:
puts("false");
goto end;
end:
return 0;
}
Lub zdecydowanie lepiej dodać sobie takie makro:
#define loop while (1)
Wtedy można zapisać twój przykład tak:
#include <stdio.h>
#define loop while (1)
int main() {
int n, i = 0;
scanf("%d", &n);
loop {
if (n == i) {
puts("true");
return 0;
}
if (n % i == 0) {
puts("false");
return 0;
}
i += 1;
}
}
Oczywiście tak się w C (i C++) nie pisze, bo to to samo co:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
if (n % i == 0) {
puts("false");
return 0;
}
}
puts("true");
return 0;
}
To by było jeśli chodzi o treść zadania.
Jednak jak sam zauważyłeś nie musimy sprawdzać aż do n
a tylko do sqrt(n)
, co można rozwiązać podobnie do Twojego rozwiązania, ale nie sprawdzając podwójnie warunków:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i * i <= n; ++i) {
if (n % i == 0) {
puts("false");
return 0;
}
}
puts("true");
return 0;
}