본문으로 바로가기
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
반응형