프로젝트 오일러 1~4
프로젝트 오일러 1
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까요?
----------------------------------------------------------------------------------------------- #include
int main(void)
{
int num = 0;
int result = 0;
int i;
for (i=1; i < 1000; i++)
{
num++;
if (num % 3 == 0 || num % 5 == 0) //3 혹은 5로 나누어 지는 num
{
result += num; //result 값에 num을 더함
}
}
printf("%d", result);
return 0;
}
----------------------------------------------------------------------------------------
프로젝트 오일러 2
#define limit 4000000
void main(){
unsigned int num[300] = {1,2};
int i=1,result=0;
while(1){
num[i+1] = num[i-1] + num[i]; //두번째 첫번째 전 항을 더해 새로운 항을 만듦
if(num[i+1] % 2 ==0)
result =result + num[i+1]; //짝수인 항을 더한다
else if(num[i+1] >= limit) //4백만 이하로 한다.
break;
i++;
}
printf("%d",result+num[1]); //처음 시작인 num[1] 인 2를 따로 더해야한다.
}
------------------------------------------------------------------------------------------
int main()
{
int i;
unsigned long long int n = 600851475143;
for (i = 2; i<=n; i++) //i=1 이 아님!!
{
if (n%i == 0){
printf("%d ", i);
n = n/i; //소인수를 하나씩 구하는 코드
i = 2; //다시 처음부터 반복문을 돌리기 위해
}
}
return 0;
}
-----------------------------------------------------------------------------------------------
반복문에서 i=1로 하면 n%1이 될 수 없어서 오류가 났었던 문제.
또한 n = n / i 를 생각 못함.
프로젝트 오일러 4
-----------------------------------------------------------------------------------------------
#include
int main()
{
int i, j; // For문을 위한 기본 값(시작 999)
int result; // 결과값(i*j)
int rn; // 뒤집어진 값
int k; // 뒤집어진 값을 위한 for문에 사용;
int max=0; // Max
int count = 0;
for (i = 999; i >= 100; i--)
{
for (j = 999; j >= 100; j--)
{
result = i * j;
// Max 값보다 작으면 대칭수 판단 할 필요 없음
if (result > max)
{
// 대칭수 판단
rn = 0;
for (k = result; k > 0; k = k / 10)
rn = rn * 10 + k % 10;
if (rn == result)
max = result;
}
}
}
printf("100~999까지의 곱에서 가장 큰 대칭수는 '%d' 입니다.\n", max);
return 0;
}
-----------------------------------------------------------------------------------------------
이 문제는 못 풀다가 지식인으로 찾아봐서 가장 간단한 코드를 골라 썼다.
이 코드를 생각해낸 분은 대단한 것 같다.
나는 배열로 푸려다가 결국 포기했다.
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까요?
----------------------------------------------------------------------------------------------- #include
int main(void)
{
int num = 0;
int result = 0;
int i;
for (i=1; i < 1000; i++)
{
num++;
if (num % 3 == 0 || num % 5 == 0) //3 혹은 5로 나누어 지는 num
{
result += num; //result 값에 num을 더함
}
}
printf("%d", result);
return 0;
}
----------------------------------------------------------------------------------------
프로젝트 오일러 2
피보나치 수열의 각 항은 바로 앞의 항 두 개를 더한 것이 됩니다. 1과 2로 시작하는 경우 이 수열은 아래와 같습니다.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
짝수이면서 4백만 이하인 모든 항을 더하면 얼마가 됩니까?
---------------------------------------------------------------------------------------------
#include#define limit 4000000
void main(){
unsigned int num[300] = {1,2};
int i=1,result=0;
while(1){
num[i+1] = num[i-1] + num[i]; //두번째 첫번째 전 항을 더해 새로운 항을 만듦
if(num[i+1] % 2 ==0)
result =result + num[i+1]; //짝수인 항을 더한다
else if(num[i+1] >= limit) //4백만 이하로 한다.
break;
i++;
}
printf("%d",result+num[1]); //처음 시작인 num[1] 인 2를 따로 더해야한다.
}
------------------------------------------------------------------------------------------
한참 해매다가 num[1]을 더하지 않아 시간이 오래걸렸던 문제
프로젝트 오일러 3
어떤 수를 소수의 곱으로만 나타내는 것을 소인수분해라 하고, 이 소수들을 그 수의 소인수라고 합니다.
예를 들면 13195의 소인수는 5, 7, 13, 29 입니다.
예를 들면 13195의 소인수는 5, 7, 13, 29 입니다.
600851475143의 소인수 중에서 가장 큰 수를 구하세요.
--------------------------------------------------------------------------------------------
#include int main()
{
int i;
unsigned long long int n = 600851475143;
for (i = 2; i<=n; i++) //i=1 이 아님!!
{
if (n%i == 0){
printf("%d ", i);
n = n/i; //소인수를 하나씩 구하는 코드
i = 2; //다시 처음부터 반복문을 돌리기 위해
}
}
return 0;
}
-----------------------------------------------------------------------------------------------
반복문에서 i=1로 하면 n%1이 될 수 없어서 오류가 났었던 문제.
또한 n = n / i 를 생각 못함.
프로젝트 오일러 4
앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?
#include
int main()
{
int i, j; // For문을 위한 기본 값(시작 999)
int result; // 결과값(i*j)
int rn; // 뒤집어진 값
int k; // 뒤집어진 값을 위한 for문에 사용;
int max=0; // Max
int count = 0;
for (i = 999; i >= 100; i--)
{
for (j = 999; j >= 100; j--)
{
result = i * j;
// Max 값보다 작으면 대칭수 판단 할 필요 없음
if (result > max)
{
// 대칭수 판단
rn = 0;
for (k = result; k > 0; k = k / 10)
rn = rn * 10 + k % 10;
if (rn == result)
max = result;
}
}
}
printf("100~999까지의 곱에서 가장 큰 대칭수는 '%d' 입니다.\n", max);
return 0;
}
-----------------------------------------------------------------------------------------------
이 문제는 못 풀다가 지식인으로 찾아봐서 가장 간단한 코드를 골라 썼다.
이 코드를 생각해낸 분은 대단한 것 같다.
나는 배열로 푸려다가 결국 포기했다.
댓글
댓글 쓰기