관리 메뉴

Storage Gonie

(12) [C++, Java] 백준 No.1929 : 소수 구하기 본문

알고리즘/백준풀이7. 수학

(12) [C++, Java] 백준 No.1929 : 소수 구하기

Storage Gonie 2019. 5. 7. 19:36
반응형

문제

풀이

자세한 풀이 : 

 

# C++(나의 풀이)

- endl을 썼다가 시간초과가 났으므로 "\n"을 사용하자.

- i*i 대신 i*2로 해준 방식으로 중복적인 연산이 존재하기 때문에 아래의 방식보다 불리하기 때문에 4ms정도 더 소요되지만
   크게 문제될 정도의 시간이 아니기 때문에 소수를 수집하여 컨트롤하기 좋은 이 방식을 선호하여 사용하는 것이 좋다.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int m, n;               // 1 <= m <= n <= 1,000,000
    cin >> m >> n;

    vector<int> check(n+1); // 초기값은 defualt로 false임
    vector<int> prime_vec;

    check[0] = true;
    check[1] = true;

    for (int i = 2; i <= n; i++)
    {
        if (check[i] == false)
        {
            if (i >= m)
                prime_vec.push_back(i);

            for (int j = i*2; j <= n; j += i)
                check[j] = true;
        }
    }

    for (int i = 0; i < prime_vec.size(); i++)
    {
        cout << prime_vec[i] << "\n";
    }
}

 

# C++(백준 풀이)
- endl을 썼다가 시간초과가 났으므로 "\n"을 사용하자.
- "i*i <= n" 으로 오버플로우를 방지한 방법으로 중복연산이 없어서 효율이 더 좋다.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int m, n;               // 1 <= m <= n <= 1,000,000
    cin >> m >> n;

    vector<int> check(n+1); // 초기값은 defualt로 false

    check[0] = true;
    check[1] = true;

    for (int i = 2; i * i <= n; i++)
    {
        if (check[i] == false)
        {
            for (int j = i*i; j <= n; j += i)
                check[j] = true;
        }
    }

    for (int i = m; i <= n; i++)
    {
        if (check[i] == false)
            cout << i << "\n";
    }
}

# Java

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        boolean[] check = new boolean[m+1];
        check[0] = check[1] = true;
        for (int i=2; i*i <= m; i++) {
            if (check[i] == true) {
                continue;
            }
            for (int j=i+i; j<=m; j+=i) {
                check[j] = true;
            }
        }
        for (int i=n; i<=m; i++) {
            if (check[i] == false) {
                System.out.println(i);
            }
        }
    }
}
반응형
Comments