소수 (Prime number)
글. 오상문 sualchi@daum.net
소수는 1과 자신 이외에는 나누어 떨어지는 수가 없는 자연수이다.
[참고] 반대로 1과 자신 이외에 나누어 떨어지는 수가 있으면 합성수라고 부른다.
(방법1) 2부터 나머지 연산으로 검사하기
소수를 구하는 가장 가단한 방법은 2부터 그 수의 1/2 부분까지 계속 나머지 연산을 해서 0이 나오는지 검사하는 것이다. 그 이후는 어차피 나머지가 0보다 크므로 계산할 필요가 없다.
예를 들어, 10237이 소수인지 검사할 때
2~5119까지 나머지 계산을 해서 0이 되는 경우가 있으면 소수 아님이라고 처리한다.
#include <stdio.h>
int isPrime(unsigned int n) {
int i;
if (n<=1)
return 0;
for(i=2; i <= n/2; i++) {
if(n%i == 0)
return 0;
}
return 1;
}
int main()
{
if(isPrime(11))
printf("소수\n");
else
printf("소수 아님\n");
return 0;
}
(방법2) 2, 3 배수를 제외해서 계산량 줄이기
#include <stdio.h>
int isPrime(unsigned int num); // 소수 68906개, 180초
int main(void)
{
unsigned int i, cnt=0;
for (i = 100000; i < 1000000; i++)
if (isPrime(i)==1) printf("%u\n", i), cnt++;
printf("count: %u\n", cnt);
return 0;
}
int isPrime(unsigned int num)
{
unsigned int i;
unsigned int y = 2;
unsigned int x;
if (num<1) 0; // 1 이하는 소수 아님
if (num==2 || num==3) return 1; // 2,3은 소수
if (num%2==0 || num%3==0) return 0; // 2와 3의 배수는 소수 아님
for (i = 5; i <= num/2; i++)
if (num%i == 0) return 0;
return 1;
}
(방법 3) 좀더 복잡한 방법... 6의 배수에서 -1. +1인 숫자인지 확인
소수를 적어보면 5 이상의 소수들은 6의 배수에서 -1, +1인 숫자들이 많은 것을 알 수 있다.
이 규칙을 이용하여 소수를 판별하는 방법으로 이전에 사용한 방법보다 훨씬 빠르다.
// 소수 68906개, 19초
int isPrime(unsigned int num)
{
unsigned int i;
unsigned int y = 2;
unsigned int x;
if (num<1) 0; // 1 이하는 소수 아님
if (num==2 || num==3) return 1; // 2,3은 소수
if (num%2==0 || num%3==0) return 0; // 2와 3의 배수는 소수 아님
x = (unsigned int) sqrt((double)num); // 제곱근 수를 이용
for (i = 5; i <= x; i += y, y = 6 - y) // 25~
if (num%i == 0) return 0;
return 1;
}
<이상>
'C' 카테고리의 다른 글
C 언어, 로또 번호 구하는 예제 (카드 추출하기) (0) | 2018.07.06 |
---|---|
C 언어, 순열 자료 출력하기 (0) | 2018.06.16 |
[C 언어] 특정 문자열을 찾아서 다른 것으로 바꾸기 strstr() (0) | 2018.06.01 |
열 개 숫자 중에서 3개의 합이 가장 큰 값을 출력하는 C 예제 (0) | 2018.05.17 |
scanf() 함수를 사용하면 보안 경고가 발생할 때 (0) | 2018.02.12 |