728x90
반응형
[23번 문제]
자신을 제외한 약수(진약수)를 모두 더하면 자기 자신이 되는 수를 완전수라고 합니다.
예를 들어 28은 1 + 2 + 4 + 7 + 14 = 28 이므로 완전수입니다.
또, 진약수의 합이 자신보다 작으면 부족수, 자신보다 클 때는 초과수라고 합니다.
12는 1 + 2 + 3 + 4 + 6 = 16 > 12 로서 초과수 중에서는 가장 작습니다.
따라서 초과수 두 개의 합으로 나타낼 수 있는 수 중 가장 작은 수는 24 (= 12 + 12) 입니다.
해석학적인 방법을 사용하면, 28123을 넘는 모든 정수는 두 초과수의 합으로 표현 가능함을 보일 수가 있습니다.
두 초과수의 합으로 나타낼 수 없는 가장 큰 수는 실제로는 이 한계값보다 작지만, 해석학적인 방법으로는 더 이상 이 한계값을 낮출 수 없다고 합니다.
그렇다면, 초과수 두 개의 합으로 나타낼 수 없는 모든 양의 정수의 합은 얼마입니까?
[코드]
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 | #include "stdafx.h" #include <iostream> #include <vector> using namespace std; bool check_prime(int num) { int temp = 0; for (int i = 1; i < num; i++) if (num%i == 0) temp += i; return temp > num; } unsigned long long ans = 0; int main() { vector <int> prime; int num[28124] = { 0 }; int max = 0; for (int i = 2; i < 28123; i++) if (check_prime(i)) { prime.push_back(i); max++; } long temp = 0; for (int i = 0; i <max-1; i++) for (int j = i; j <max; j++) { temp = prime[i] + prime[j]; if (temp <= 28123) num[temp] = 1; else break; } for (int i = 0; i < 28124; i++) if (num[i] == 0) ans += i; cout <<endl<< ans << endl; system("pause"); return 0; } | cs |
728x90
반응형
'Solution > Project Euler' 카테고리의 다른 글
[25/C++] 피보나치 수열에서 처음으로 1000자리가 되는 항은 몇 번째? (0) | 2018.05.29 |
---|---|
[24/C++] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9로 만들 수 있는 1,000,000번째 사전식 순열은? (0) | 2018.05.28 |
[22/C++] 영문 이름 점수 합계 구하기 (0) | 2018.05.26 |
[21/C++] 10000 이하 모든 친화수(우애수)의 합은? (0) | 2018.05.26 |
[20/C++] 100! 의 자리수를 모두 더하면? (0) | 2018.05.26 |