반응형


소수관련된 문제를 풀다가 소수구하기 프로그램을 짜보았다.

여러가지 방법이있는것 같다. 

지금 내가 짠 것은 가장 기본적으로 생각할수있는 코드인것같다.


2부터 입력받은 숫자전의 숫자까지 나누어 본후

만약 나머지가 0이 나오지않으면

카운트를 올리고,

카운트가 모두돌아간경우(입력받은값-2 (0과1제외)) 

소수라고 출력해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n;
    int a=0;
    
    cin>>n;
 
    for(int i=2;i<n;i++)
    {
        if(n%i!=0)
        {
            a=a+1;
        }
    }
 
    if(a==n-2)
    {
        cout<<"소수가 맞음"<<endl;
    }
    else
    {
        cout<<"소수가아님"<<endl;
    }
 
 
}
cs


이것다음으로는 
count를 세는것이아닌
true false처럼 한번이라도 나누어떨어질때 변수의 값을 바꾸어 판별하는 방법이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n;
    int a=1;
    
    cin>>n;
 
    for(int i=2;i<n;i++)
    {
        if(n%i==0)
        {
            a=0;
        }
    }
 
    if(a==0)
    {
        cout<<"소수가 아님"<<endl;
    }
    else
    {
        cout<<"소수가 맞음"<<endl;
    }
 
 
}
cs



여기서 조금더 좋은 프로그램은, for문 안의 if문에 조건만족시 break문을 넣어주어 소수가아니라는것을 알았을때 더이상 돌아가지 않게 하는것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n;
    int a=1;
    
    cin>>n;
 
    for(int i=2;i<n;i++)
    {
        if(n%i==0)
        {
            a=0;
            break;
        }
    }
 
    if(a==0)
    {
        cout<<"소수가 아님"<<endl;
    }
    else
    {
        cout<<"소수가 맞음"<<endl;
    }
 
 
}
cs



그러던중 나는 더 놀라고말았다...

더좋은 방법?........... 알고리즘? 을 찾아버렸다 바로 에라토스테네스의 체 라는것이다!

2부터 입력받은 숫자까지 모두 배열에 담고,

소수가아닌것들을 모두 0으로 바꾸어 버린다.

(2부터 입력받은수까지 배수들을 0으로바꾼다)

ex 2의배수를 지운다(2를제외한).  4 6 8 ...

   3의배수를 지운다(3을제외한).  6 9 12 ...

0이아닌수는 모두 소수이다.


그래서 아래소스는 입력받은 숫자보다 작은 소수를 나오게 하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
 
    int *arr=new int[n];
 
    for(int i=2;i<=n;i++)
    {
        arr[i]=i;
    }
 
    for(int i=2;i<n;i++)
    {
        for(int j=2;j<n;j++)
        {
        
            if(arr[j]!=&& arr[j]%i==0)
            {
                arr[j]=0;
            }
 
        }
    }
 
    for(int i=2;i<n;i++)
    {
        if(arr[i]!=0)
        {
             cout<<arr[i]<<endl;
 
        }
    }
 
 
    
}
cs




반응형

+ Recent posts