link : https://www.acmicpc.net/problem/1644
소수의 연속합 성공
문제
하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다.
- 3 : 3 (한 가지)
- 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지)
- 53 : 5+7+11+13+17 = 53 (두 가지)
하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한 소수는 반드시 한 번만 덧셈에 사용될 수 있기 때문에, 3+5+5+7과 같은 표현도 적합하지 않다.
2 이상의 자연수가 주어졌을 때, 이 자연수를 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)
출력
첫째 줄에 자연수 N을 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 출력한다.
예제 입력 1
20
예제 출력 1
0
예제 입력 2
3
예제 출력 2
1
예제 입력 3
41
예제 출력 3
3
예제 입력 4
53
예제 출력 4
2
소수의 연속합 문제이다. 구간을 정해서 구간합을 구하면서 점검하면 되는 문제이다.
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 | #include<iostream> #include<math.h> using namespace std; #define MAX 4000001 int N,cnt; long long sum; int ary[MAX]; void primeNum(){ int sqrt_N = sqrt(N); for(int i=2;i<=sqrt_N;i++){ if(ary[i]==0)continue; for(int j=i*i;j<=N;j+=i){ ary[j]=0; } } } int main(){ cin >> N; for(int i=2;i<=N;i++) ary[i] = i; primeNum(); if(ary[N] != 0) cnt = 1; for(int j=2; j<=N;j++){ sum = 0; if(ary[j] == 0) continue; for(int i=j; i<N;i++){ if(ary[i] == 0) continue; sum += i; if(sum == N){ cnt++; break; } if(sum > N) break; } } cout << cnt; return 0; } | cs |
'Programming > BOJ Solutions' 카테고리의 다른 글
[백준 1535번] 안녕 (0) | 2018.08.23 |
---|---|
[백준 1837번] 암호제작 (0) | 2018.08.22 |
[백준 11653번] 소인수분해 (0) | 2018.08.22 |
[백준 2960번] 에라토스테네스의 체 (0) | 2018.08.22 |
[백준 1735번] 분수 합 (0) | 2018.08.22 |