오랜만에 글 써보네요.
미안하지만 오늘 글은 모두 아는 소수 판단 알고리즘입니다. ㅈㅅㅈㅅㅈㅅ
소수 : 1과 자신 외에는 나누어 떨어지는 정수가 없는 양의 정수.
소수의 정의만 보면 2부터 n-1까지 나누어보아서 나누어지지 않으면 소수 나누어지면 소수가 아니라고 할 수 있습니다.
int prime(int n)
{
int i;
for(i=2;i<n;i++)
if(n%i==0)
return 0;
return 1;
}
이 함수는 느리다. ㅡ,.ㅡ
소수를 판별할 때 n의 제곱근까지만 나누어 보면 된다고 한다.
16을 보면 16의 약수는 1*16, 2*8, 3*6, 4*4, 6*3, 8*2, 16*2 이렇게 앞 뒤가 서로 대칭된다.
그래서 제곱근을 구해주는 합수 sqrt(int)함수를 써보겠습니다.
int prime(int n)
{
int i, sqrn;
sqrn = (int)sqrt(n);
for (i = 2; i <= sqrn; i++)
if (n % i == 0)
return 0;
return 1;
}
소수를 구하는 다른 알고리즘에는 에라토스의 체가 있습니다.
1부터 n까지의 소수를 구한다고 할 때 소수의 배수를 지워나가면서 남아있는 수를 구하는 알고리즘입니다.
main()
{
int *arr;
int i,j;
arr=(int *)calloc(101,sizeof(int));//0부터 100까지 배열생성;
for(i=2;i<=100;i++)
{
if(arr[i]==1)
continue;
j=i+i;
while(j<=100)
{
arr[j]=1;
j+=i;//i의 배수로 증가
}
}
for(i=2;i<=100;i++)
if(arr[i]==0)
printf("%d ",i);
}
다음부턴 열심히 쓸게요. 때리지 마요 제발
참고로, sqrt(n)까지 루프를 돌릴 때 홀수만 돌리면 됩니다.
짝수는 어짜피 2x홀수이니까요.
오랜만에 보니 반갑네요.
안녕하세요 ㅎㅎ
요즘 자주 접속하질못하네요... 반가워요~!~!
아리스토테네스의 체에서 소수 i를 찾아서 i의 배수를 지울때 2i 부터 돌리는데 사실 i*i부터 돌려도 됩니다. 왜 그런지는 직접 해보시면..;;
우와~~ 좋은 정보 감사합니다 ^^