알고리즘
C++ 소수 ( 쉽게 구하는 방법 )
Chars4785
2019. 2. 5. 16:05
1. 루트를 이용해서 구하기
결론 부터 이야기하면 n 의 제곱근 까지만 조사해 보면 된다.
ex)
for(int i =0; i< sqrt(x) ;i++)
if( number % i ==0)
break;
특정 수 n 이 있다고 생각해 보자
n = a* b 로 된 합성수이다.
n 의 제곱근을 n' 이라고 하면 ( 25의 제곱근은 ? => x^2 = 25 가 되는 x 는 무엇인가? 5가 된다 )
a 가 n'보다 크거나 같다보면 ( a >= n' ) b는 n' 보다 작거나 같다 ( b <=n')
왜냐면 25로 생각해 보면 5*5 가 된다 그런데 1*25도 된다. 즉 무조건 하나는 제곱근 보다 작게 된다. 만약 합성수라면 제곱근 보다 작
은 수에서 나눠지게 된다. 또 다른 예로는 16으로 하면 4*4 있고 2*8 이 있다. 제곱근인 4보다는 2는 작고 8은 크게 된다. 즉 4까지만
조사 하면 2에서 나눠지게 되기 때문에 소수 판별이 된다.
코드
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
void findPrim(int first,int second)
{
int count=0;
bool check = true;
for(int i=first ; i <= second ;i++)
{
for(int j=3;j<= sqrt(i);j+=2)
{
if(i%j==0 || i% 2 ==0)
{
check = false;
break;
}
}
if((check && i!=1) || second == 2)
{
count++;
}
check = true;
}
cout<< count<<endl;
}
int main()
{
vector<int> v;
v.push_back(10);
int number[123456];
int index =0;
while(1){
int num;
cin>>num;
if(num ==0)
{
break;
}else{
number[index++]=num;
}
}
for(int i =0;i<index;i++)
findPrim(number[i]+1,2*number[i]);
return 0;
}
----------------------------------------]------
2. 에라스토테네스의 체를 이용하여 소수의 범위