프로젝트 오일러 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

피보나치 수열의 각 항은 바로 앞의 항 두 개를 더한 것이 됩니다. 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 입니다.
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;
}
-----------------------------------------------------------------------------------------------
이 문제는 못 풀다가 지식인으로 찾아봐서 가장 간단한 코드를 골라 썼다.
이 코드를 생각해낸 분은 대단한 것 같다.
나는 배열로 푸려다가 결국 포기했다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리