반응형
무식한 방법으로 푼다. 루프를 빠져나오는 조건을 잘 줘야 빨리 끝난다. 소수를 구할 때, 나눌 수가 소수후보의 제곱근보다 크다면 빠져나오라는 조건을 빼면 시간이 하염없이 걸리고, 연속된소수의 합이 다시 소수인 모든 수를 구하는 것이 아니고, 그 소수 갯수의 최대값을 구한다는 조건을 for 루프에 잘 적용하면 또 시간을 더 단축할 수 있다. 물론 깔끔함은 훼손되지.
/*
* http://projecteuler.net/index.php?section=problems&id=50
Problem 50
15 August 2003
The prime 41, can be written as the sum of six consecutive primes:
41 = 2 + 3 + 5 + 7 + 11 + 13
This is the longest sum of consecutive primes that adds to a prime
below one-hundred. The longest sum of consecutive primes below
one-thousand that adds to a prime, contains 21 terms, and is equal
to 953.
Which prime, below one-million, can be written as the sum of the
most consecutive primes?
* 백만보다 작은 소수 중에서 어느 것이 가장 많은 연속된 소수의 합으로 표현될 수
* 있나?
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ep50
{
class Program
{
private static int 최대값 = 1000000;
private static List<int> 소수리스트 = new List<int>();
static void Main(string[] args)
{
모든소수구한다();
연속된소수합이소수인경우찾자();
}
static void 모든소수구한다()
{
int[] 잘아는소수 = { 2, 3, 5, 7, 11, 13 };
foreach(int 소수 in 잘아는소수)
소수리스트.Add(소수);
for(int 소수후보 = 17 ; 소수후보 < 최대값 ; 소수후보 += 6)
{
if (소순가(소수후보))
{
소수리스트.Add(소수후보);
}
if(소순가(소수후보 + 2))
소수리스트.Add(소수후보+2);
}
}
static bool 소순가(int 소수후보)
{
foreach (int 소수 in 소수리스트)
{
if (소수후보 < 소수 * 소수)
break;
if (소수후보 % 소수 == 0)
return false;
}
return true;
}
static void 연속된소수합이소수인경우찾자()
{
int 시작인덱스 = 0, 끝인덱스 = 0;
int 소수합 = 0;
int 소수개수, 소수개수최대값 = 1;
for(시작인덱스 = 0; 시작인덱스 < 소수리스트.Count(); 시작인덱스++)
for (끝인덱스 = 시작인덱스 + 소수개수최대값 - 1; 끝인덱스 < 소수리스트.Count(); 끝인덱스++)
{
소수합 = 연속소수합(시작인덱스, 끝인덱스);
소수개수 = 끝인덱스 - 시작인덱스 + 1;
if(소수개수 > 소수개수최대값) {
if (소수합 > 최대값)
break;
if (소수리스트.Contains(소수합) && 소수개수최대값 < 소수개수)
{
소수개수최대값 = 소수개수;
Console.WriteLine("{0} = {1} + ... + {2}, {3} 개",
소수합, 소수리스트[시작인덱스], 소수리스트[끝인덱스], 소수개수);
}
}
}
}
static int 연속소수합(int 시작인덱스, int 끝인덱스)
{
int 소수합 = 0;
for(int i = 시작인덱스; i <= 끝인덱스; i++)
{
소수합 += 소수리스트[i];
}
return 소수합;
}
}
}
728x90
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[파이썬] 이집트분수 (0) | 2020.04.23 |
---|---|
[EP 048] ∑ i^i (i=1 ~ 1000) 의 마지막 10자리수 구하기 (0) | 2019.12.24 |
[Euler Project 134] 1219는 소수 19로 끝나는 23의 배수 (3) | 2012.12.14 |
[Euler Project 089] 로마숫자 최적화 (0) | 2012.12.06 |
[Euler Project 114] (1) | 2012.12.05 |