The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.
에라토스테네스의 체를 이용한 소거법으로 합성수를 제거 후 합산하는 방법을 사용한다.
long long int Problem010(int number)
{
long long int ret = 0;
int* numArr = new int[number + 1];
for (int i = 2; i <= number; i++)
{
numArr[i] = -1;
}
for (int i = 2; i <= number; i++)
{
if (numArr[i] == -1)
{
ret += i;
for (int j = i * 2; j <= number; j += i)
{
numArr[j] = 0;
}
}
}
delete[] numArr;
return ret;
}
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a2 + b2 = c2
For example, 32 + 42 = 9 + 16 = 25 = 52.
There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product abc.
a+b+c=1000이 되는 피타고라스 수의 쌍을 찾아 세 수의 곱을 구하는 문제. 당연하지만 a, b, c는 모두 자연수다.
int Problem009(int number)
{
int ret = -1;
bool escape = false;
for (int a = 1; a < number / 3; a++)
{
for (int b = a + 1; b < number - a; b++)
{
int c = number - a - b;
if (b >= c)
{
break;
}
if (a * a + b * b == c * c)
{
ret = a * b * c;
escape = true;
break;
}
}
if (escape)
{
break;
}
}
return ret;
}
Find the thirteen adjacent digits in the 1000-digit number that have the greatest product. What is the value of this product?
연속으로 이어지는 1000자리 수에서 연속되는 13개의 정수를 곱했을 때 가장 큰 수를 구하는 문제. 13개의 수를 곱하되 0이 나올 경우에는 그 근처에 있는 수는 결과가 모두 0이 되므로 일정량만큼 건너뛰는게 연산량을 줄이는데 도움이 된다. 범위가 13개일 경우 최대 값은 2조 5천억에 가까우므로 때문에 C++에서는 long long int를 사용했다.
// 본문에 있는 숫자 배열은 "Project_Euler_008.txt"에 저장
long long int Problem008(int digitScope)
{
char* numbers = new char[1000];
char* read = new char[51];
std::ifstream file("Project_Euler_008.txt");
for(char i = 0; i < 20; i++)
{
file.getline(read, 51);
for (char j = 0; j < 50; j++)
{
numbers[50 * i + j] = read[j] - '0';
}
}
delete[] read;
file.close();
long long int ret = 0;
for (int i = 0; i < 1000 - digitScope; i++)
{
long long int multiple = 1;
for (int j = 0; j < digitScope; j++)
{
if (numbers[i + j] == 0)
{
i = i + j;
break;
}
multiple *= numbers[i + j];
}
if (multiple > ret)
{
ret = multiple;
}
}
delete[] numbers;
return ret;
}
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10 001st prime number?
10,001번째 소수가 무엇인지를 구하는 문제
long long int Problem007(unsigned int number)
{
long long int ret;
unsigned int count = 0;
for (int i = 2; true; i++)
{
if (IsPrime(i))
{
ret = i;
count++;
}
if (count == number)
{
break;
}
}
return ret;
}
bool IsPrime(int number)
{
bool ret = true;
for (int i = 2; i * i <= number; i++)
{
if (number % i == 0)
{
ret = false;
break;
}
}
return ret;
}
The sum of the squares of the first ten natural numbers is,
12 + 22 + ... + 102 = 385
The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)2 = 552 = 3025
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.
합의 제곱 - 제곱의 합 을 구하는 문제.
long long int Problem006(unsigned int number)
{
long long int sum = SumUpToScope(number);
long long int Squares = 0;
for (unsigned int i = 1; i <= number; i++)
{
Squares += i * i;
}
return sum * sum - Squares;
}
int SumUpToScope(int scope)
{
return ((1 + scope) * scope) / 2;
}
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
1~20까지의 연속된 수에 대한 최소공배수를 구하는 문제다.
1. n은 소수인가? 2. n이 소수라면 20 이하의 가장 큰 n^m을 구해서 결과에 곱한다. 3. 1~2를 20까지 반복
이와 같이 진행하면 결과에는 순서대로 16, 9, 5, 7, 11, 13, 17, 19가 곱해진다.
long long int Problem005(int number)
{
long long int ret = 1;
long long int factor;
for (int i = 2; i <= number; i++)
{
factor = 1;
if (IsPrime(i))
{
while (factor <= number)
{
factor *= i;
}
factor /= i;
ret *= factor;
}
}
return ret;
}
bool IsPrime(int number)
{
bool ret = true;
for (int i = 2; i * i <= number; i++)
{
if (number % i == 0)
{
ret = false;
break;
}
}
return ret;
}
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
세 자리 수끼리 곱해서 구할 수 있는 가장 큰 대칭수 구하기
int Problem004(int digit)
{
int ret = -1;
int start = 1;
for (int i = 1; i < digit; i++)
{
start *= 10;
}
int end = start * 10;
for (int i = start; i < end; i++)
{
for (int j = start; j < end; j++)
{
if (SymmetryChecker(i * j) && ret < i * j)
{
ret = i * j;
}
}
}
return ret;
}
int GetDigit(int number)
{
if (number == 0)
{
return 0;
}
if (number < 0)
{
number *= -1;
}
int ret = 1;
while (true)
{
number /= 10;
if (number == 0)
{
break;
}
ret++;
}
return ret;
}
bool SymmetryChecker(int number)
{
int digit = GetDigit(number);
char* numArr = new char[digit];
for (int i = 0; i < digit; i++)
{
numArr[i] = number % 10;
number /= 10;
}
bool ret = true;
for (int i = 0; i < digit / 2; i++)
{
if (numArr[i] != numArr[digit - i - 1])
{
ret = false;
break;
}
}
delete[] numArr;
return ret;
}
What is the largest prime factor of the number 600851475143 ?
600,851,475,143 의 소인수 중에서 가장 큰 소인수를 구하기.
long long int Problem003(long long int number)
{
long long int ret = number;
long long int i = 1;
while (i * i <= number)
{
i++;
if (number % i == 0)
{
ret = i;
number /= i;
i = 1;
if (number == 1)
{
break;
}
}
}
return ret;
}