소수인지 확인해야 할 수를 n이라고 할 때, 2부터 (n-1)까지의 수가 n의 약수인지 아닌지를 %를 통해 확인하면 된다.
풀이1
반복문의 사용이 불가피하다고 생각되어 반복을 조금이라도 줄이려고 3부터 n-1까지 홀수만을 체크했다.
n = 1일때는 소수가 아니고
n = 2일때는 소수이고
n > 2일때는 3이상의 홀수의 배수인지를 루프를 통해 체크하는 방식인데,
코드를 가능한 단순화했더니 직관적이지 못하다.
실제로도 코드를 줄이려고 한 후 계속 디버그를 해야했다.
#include <stdio.h>
int main(void)
{
int N, n, cnt = 0, i, isPrime;
scanf("%d", &N);
while (N--)
{
scanf("%d", &n);
if (isPrime = n > 1 && (n % 2 || n==2)) // n이 1보다 크고, 2이거나 홀수일 때 isPrime = TRUE
for (i = 3; i < n && (isPrime = n % i); i += 2); // n=1,2,3일땐 루프 바로 나옴
if (isPrime)
cnt++;
}
printf("%d", cnt);
return 0;
}
원코드
더보기
#include <stdio.h>
int main(void)
{
int N, n, cnt = 0, i, isPrime;
scanf("%d", &N);
while(N--)
{
scanf("%d", &n);
isPrime = 1;
if(n == 1) isPrime = 0;
else
{
if (n != 2 && n % 2 == 0) isPrime = 0;
else
for (i = 3; isPrime && i < n; i += 2)
if (n % i == 0) isPrime = 0;
}
if (isPrime) cnt++;
}
printf("%d", cnt);
return 0;
}
풀이2
97같은 수가 왔을 때를 대비해 반복횟수를 굳이 줄이려고 하지 않고,
2부터 n-1까지의 수를 짝수,홀수 할 것 없이 모두 체크한다면 코드는 좀 더 알아보기 쉬워진다.
#include <stdio.h>
int main(void)
{
int N, n, cnt = 0, i;
scanf("%d", &N);
while(N--)
{
scanf("%d", &n);
for (i = 2; i < n && n % i; i++);
cnt += (n == i);
}
printf("%d", cnt);
return 0;
}
'문제풀이' 카테고리의 다른 글
[C언어] 백준 11653번 소인수분해 (0) | 2022.01.04 |
---|---|
[C언어] 백준 2581번 소수 (0) | 2022.01.03 |
[C언어] 백준 1011번 Fly me to the Alpha Centauri (0) | 2021.12.31 |
[C언어] 백준 10757 큰수 A+B (0) | 2021.12.29 |
[C언어] 백준 2275 부녀회장이 될테야 (0) | 2021.12.29 |