#include <iostream>


using namespace std;


int main() {

const int size = 20;

int i = 0, j = 0, num = 0;

int a = 0, b = 0, c = 0, d = 0;

int arr[20][20] =

{

{8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8},

{49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0},

{81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65},

{52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 36, 91},

{22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80},

{24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50},

{32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70},

{67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21},

{24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72},

{21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 00, 61, 33, 97, 34, 31, 33, 95},

{78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92},

{16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57},

{86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58},

{19, 80, 81, 68, 05, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40},

{04, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66},

{88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69},

{4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36},

{20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 04, 36, 16},

{20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54},

{1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48}

};


for (; ;) {

if (num < arr[i][j] * arr[i][j + 1] * arr[i][j + 2] * arr[i][j + 3]) {

num = arr[i][j] * arr[i][j + 1] * arr[i][j + 2] * arr[i][j + 3];

a = arr[i][j];

b = arr[i][j + 1];

c = arr[i][j + 2];

d = arr[i][j + 3];

}


if (num < arr[i][j] * arr[i + 1][j] * arr[i + 2][j] * arr[i + 3][j]) {

num = arr[i][j] * arr[i + 1][j] * arr[i + 2][j] * arr[i + 3][j];


a = arr[i][j];

b = arr[i+1][j];

c = arr[i+2][j];

d = arr[i+3][j];

}


if (num < arr[i][j] * arr[i + 1][j + 1] * arr[i + 2][j + 2] * arr[i + 3][j + 3]) {

num = arr[i][j] * arr[i + 1][j + 1] * arr[i + 2][j + 2] * arr[i + 3][j + 3];


a = arr[i][j];

b = arr[i+1][j + 1];

c = arr[i+2][j + 2];

d = arr[i+3][j + 3];

}



if (i == 16)

break;


if (j == 16) {

i++;

j = 0;

}


if (j < 16)

j++;

}

cout << num<<endl<<a<<" "<<b << " " << c << " " << d << " ";

}


10 이하의 소수를 모두 더하면 2 + 3 + 5 + 7 = 17 이 됩니다.

이백만(2,000,000) 이하 소수의 합은 얼마입니까?





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int main() {
    int i, count, result = 0;
 
    for (i = 2; i <= 2000000; i++) {
        count = 0;
        for (int j = 1; j <= i; j++)
            if (i%j == 0)
                count++;
        if (count == 2)
            result += i;
    }
    cout << result << endl;
}
cs



소수를 크기 순으로 나열하면 2, 3, 5, 7, 11, 13, ... 과 같이 됩니다.

이 때 10,001번째의 소수를 구하세요.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
int main() {
    int count, countb = 0;
    long i;
 
    for (i = 2; i < 100000000; i++) {
        count = 0;
        for (long j = 1; j <= i; j++)
            if (i%j == 0)
                count++;
 
        if (count == 2)
            countb++;
 
        if (countb == 10001) {
            cout << i;
            return 0;
        }
    }
}
cs



1부터 10까지 자연수를 각각 제곱해 더하면 다음과 같습니다 (제곱의 합).

12 + 22 + ... + 102 = 385

1부터 10을 먼저 더한 다음에 그 결과를 제곱하면 다음과 같습니다 (합의 제곱).

(1 + 2 + ... + 10)2 = 552 = 3025

따라서 1부터 10까지 자연수에 대해 "합의 제곱"과 "제곱의 합" 의 차이는 3025 - 385 = 2640 이 됩니다.

그러면 1부터 100까지 자연수에 대해 "합의 제곱"과 "제곱의 합"의 차이는 얼마입니까?





1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main() {
    int result = 0, result1 = 0;;
    for (int i = 1; i <= 100; i++)
        result = result + i*i;
    cout << result << endl// 제곱의 합
    for (int i = 1; i <= 100; i++)
        result1 += i;
    cout << result1*result1 << endl// 합의 제곱
}
cs


1 ~ 10 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 2520입니다.

그러면 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 얼마입니까?





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
무식한게 짱
 
#include <iostream>
 
using namespace std;
 
int main() {
    long i, counta = 0;
    for (i = 20; i < 10000000000; i++) {
        counta = 0;
        for (int j = 1; j < 21; j++)
            if (i%j == 0)
                counta++;
        if (counta == 20) {
            cout << i;
            break;
        }
    }
}
cs



앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.

두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.

세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?





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
무식한게 짱..
 
#include <iostream>
#include <sstream>
 
using namespace std;
 
int main() {
    int count = 0, length = 0;
    int intval, temp = 100 * 100;
 
    for (int i = 999; i >= 100; i--) {
        count = 0;
        for (int j = 999; j >= 100; j--) {
            intval = i*j;
            count = 0;
            string str = to_string(intval);
            for (int a = 0, b = 5; a < 3; a++, b--) {
                if (str[a] == str[b])
                    count++;
                if (count == 3) {
                    if (temp < i*j)
                        temp = i*j;
                }
            }
        }
    }
    cout << temp;
}
cs



어떤 수를 소수의 곱으로만 나타내는 것을 소인수분해라 하고, 이 소수들을 그 수의 소인수라고 합니다.
예를 들면 13195의 소인수는 5, 7, 13, 29 입니다.

600851475143의 소인수 중에서 가장 큰 수를 구하세요.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package profile;
 
public class euler {
 
    public static void main(String args[]) {
        long a = 600851475143L;
        int count = 0;
 
        for (long i = 2; i < a; i++) {
            if (a % i != 0)
                continue;
            for (int ai = 1; ai <= i; ai++)
                if (i % ai == 0)
                    count++;
            if (count > 2) {
                count = 0;
                continue;
            }
            count = 0;
            System.out.print(i + " ");
        }
    }
}
cs


About Project Euler @ kr


Leonhard Euler (1707-1783) 
레온하르트 오일러 (1707-1783)

환영합니다!


프로젝트 오일러 (ProjectEuler.net) 는 수학적인 문제들을 컴퓨터 프로그래밍으로 하나씩 해결해가는 퀴즈 풀이 사이트입니다. 여기에는 흥미로운 내용이 많이 있지만, 문제나 댓글 등이 모두 영어로 되어 있어서 다소 부담스러울 수 있습니다.

우리 사이트 (Project Euler @ kr) 에서는 보다 많은 이들이 쉽게 접근해서 즐길 수 있도록 원본 문제를 한국어로 번역해서 제공합니다. 문제 개수는 우선 수십개 정도로 시작하고, 번역이 마무리되는대로 계속해서 추가해 가겠습니다. 
또한 자체적인 회원 체계와 문제별 게시판도 마련해 두었습니다.

아래는 원본 사이트에 실린 소개글입니다.


프로젝트 오일러 소개


여기 실린 문제들을 풀려면 수학적인 지식이나 프로그래밍 솜씨 한가지만으로는 충분하지 않습니다. 수학적인 지식이 있다면 좀 더 우아하고 효율적인 방법을 찾을 수 있겠지만, 대부분의 경우 문제를 해결하려면 컴퓨터에 대한 지식과 프로그래밍 기법을 동원해야 합니다.

새로운 분야에 대한 탐구심을 키워가고, 재미있게 즐기는 중에 새로운 개념을 하나 둘 알아갈 수 있는 장을 마련하자는 것이 이 프로젝트를 시작해서 지금까지 이르게 된 동기라고 할 수 있겠습니다.


누구를 대상으로 하나요?


기본적인 교과과정만으로는 배움에 대한 욕구를 채우기 부족한 학생들로부터, 수학을 전공하지는 않았지만 수학적인 것에 관심이 있는 성인들, 그리고 스스로의 문제 해결 능력과 수학적 역량을 연마하고자 하는 전문가들이 모두 대상입니다.


누구든지 문제를 풀 수 있나요?


문제의 난이도는 다양하며, 연쇄적인 학습 효과를 얻을 수 있도록 되어 있습니다. 즉, 어떤 문제를 해결하면서 얻은 새로운 지식을 발판삼아, 전에 손도 댈 수 없었던 다른 문제에 도전할 수 있게 되는 식입니다. 그러니 마음을 단단히 먹는다면 더디기는 하겠지만 확실하게 모든 문제를 해결할 수 있을 것입니다.




+ Recent posts