본문 바로가기
알고리즘/투포인터

연속적인 소수의 합 더블릿 (1644 백준)

by tryotto 2019. 2. 13.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
 
int num[4000001= { 0 };
int prime[4000001= { 0 };
int idx = 0;
 
void Erasto() {
    for (int i = 2; i < 10000; i++) {
        for (int j = 2; j < 10000; j++) {
            if (i*< 1000000) {
            //    printf("%d ", i*j);
                num[i*j] = 1;
            }
        }
    }
    
    for (int i = 2; i < 1000000; i++) {
        if (num[i] == 0) {
            prime[idx++= i;        
        }
    }
}
 
int main() {
    Erasto();
 
    while (1) {
        int n;
        scanf("%d"&n);
 
        if (n == 0)
            return 0;
 
        int left = 0, right = 0, sum = prime[0],tmp=0;
        while (right < n&&left <= right) {
    //        printf("%d %d %d\n", left, right, sum);
            if (sum > n) {
                sum -= prime[left++];                                
                if (left > right&&left<n) {
                    right = left;
                    sum = prime[left];
                }
            }
            else if (sum < n) {
                sum += prime[++right];
            }
            else {
                tmp++;
                sum += prime[++right];            
            }
        }        
        printf("%d\n", tmp);
    }
}
cs


'알고리즘 > 투포인터' 카테고리의 다른 글

1806 부분합 (더블릿 부분합)  (0) 2019.02.12
2003 수들의 합(2)  (0) 2019.02.12