개발/문제풀이

Code. 프로젝트 오일러. KR 7번. C++

ordi2016. 9. 25. 14:56

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 6번. C++

ordi2016. 9. 25. 14:33

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 5번. C++

ordi2016. 9. 25. 14:22

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 4번. C++

ordi2016. 9. 25. 14:08

프로젝트 오일러 KR 4번.


세자리 수를 곱해 만들 수 있는 가장 큰 대칭수



문제 출처.

http://euler.synap.co.kr/prob_detail.php?id=4



요점.

대칭수(Palindrome) ex)101, 45754, 9005009

하지만 중요한건 3자리 수, 두개를 곱해서 가장 큰 대칭 수를 만들어야 한다는 것이다.




풀이 방법.

<A : 101 ~ 999> * <A ~ 999>를 일단 순차적으로 돌렸다.

두번째 피연산자의 범위가 첫번째 피연사자인 A로 시작하는 이유는

예를들어 101 * 102 = 102 * 101 이기 때문에,

같은 결과를 두번 반복하는 짓을 막기 위해서이다.


그리고 그걸 계산한 수를 어느 곳에 저장(est_num).

그걸 어느 변수(temp)에 저장해 뒤집는다.

뒤집는 수는 rev_num에 저장하고,

rev_num과 est_num이 같다면,

est_num은 대칭수!

이과정을 통해 est_num의 최대값을 찾아내면 된다.

 




코드.





요약.

대칭수라는게 뭔지 알았다.

의미가 같은 과정은 막는게 좋겠지?



댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 3번. C++

ordi2016. 9. 24. 20:19

프로젝트 오일러 KR 3번.


가장 큰 소인수 구하기



문제 출처.

http://euler.synap.co.kr/prob_detail.php?id=3



요점.

프로그래밍으로 해당하는 수(600851475143)를 어떻게 소인수 분해 할 것인가가 관점이다.




풀이 방법.

생각 보다 복잡하게 생각 할 필요가 없다.


소인수 분해 해야하는 수(A)와 소인수(B)가 있다.

1) B가 A의 소인수인지 확인한다

 => A % B == 0 인지 확인한다.

2-True) A를 B로 그만 나누어 떨어 질때까지 B로 나눈다.

 => 예를 들어 4 = 2 * 2라는 표현이 가능하다.

     다시 말해 소수가 중복으로 존재가 가능 하다.

     그러므로, 해당 소수로 그만 나누어 떨어 질때 까지 A를 계속 나눈다.

3) B는 다음 소수로 넘어간다.


위가 풀이를 요약해둔 것이다.

이를 코드로 옮겨보면

for (int i = 2; target > 1; i++)

{

    if (target % i == 0)

        while (target % i == 0)

        {

            target /= i;

            cout << i << '\t' << target << endl;

        }

}


이렇게 된다.

뭔가 이상한데....

i가 항상 소수라는 보장이 있나?? 라는 생각이 들 수 있다.

아래의 플로우를 보고 혼자서 생각해보길 권장한다.


예를들어 12 = 2 * 2 * 3이라는 수를 소인수 분해 한다 생각해보자

target이란 변수는 12로 초기화가 되어있다.

1) 12 는 2로 나누어 떨어지니 if문 안으로 들어간다.

  12는 2로 나누어 떨어지니 6이된다.

  6은 또 2로 나누어 떨어지니 3이 된다.

2) 3은 3으로 나누어떨어지니 if문 안으로 들어가 1이된다.

3) target이 1이니 끝이 난다.


즉, 12는 4로 나누어 떨어지지만 이미 앞 과정에서 2라는 소수에 의해 나누어져서, 3이 되었다.

앞 과정에서 소수가 아닌 수는 이미 나누어져 없어진다는 결론이다.


그래서 이런식으로 코딩을 하게되면

마지막에 나오는 출력이 소인수중 가장 큰수가 나타나게 된다.



코드 해석.





요약.

소인수분해하는 코드를 복잡하게 생각하지말고, 간단히 순차적으로만 나가자.





댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 2번. C++

ordi2016. 9. 19. 19:27

프로젝트 오일러 KR 2번.


피보나치 수열에서 400만 이하이면서 짝수인 항의 합



문제 출처.

http://euler.synap.co.kr/prob_detail.php?id=2



요점.

피보나치 수열을 한.항.씩 올라가면서, 각 항을 짝수인지 체크한다.

그리고 해당 항이 짝수이면 합을 저장하는 변수에 더한다.



풀이 방법.

피보타치수열을 일반화 시켜보면



여기에 초기 값을



으로 문제에서 주었다.


그럼 계속 다음 항으로 넘어가면서 해당 항이 짝수이면 

sum 이라는 변수에 더해주었다.


그리고 피보나치 항이 짝수가 나올 때 마다, 현재 상태를 확인 하기 위해

<합> <이전의 피보나치 항> <현재의 피보나치 항>

을 출력했다.


마지막으로 현재의 피보나치 항이 400만을 넘어가면 반복문을 종료 하였다.




소스 코드.




콘솔.


2 1 2

10 5 8

44 21 34

188 89 144

798 377 610

3382 1597 2584

14328 6765 10946

60696 28657 46368

257114 121393 196418

1089154 514229 832040

4613732 2178309 3524578

=>4613732


느낌.

1) 피보나치 수열을 코딩해보았다.

2) 오보플로우가 발생할까봐 조마조마 했지만 다행히 넘진 않았다.

3) const의 개념과 #define 둘중에 어느게 더 좋은건지 감이 안잡힌다. 공부해봐야겠다.

댓글

개발/문제풀이

Code. 프로젝트 오일러. KR 1번. C++

ordi2016. 9. 18. 19:24

프로젝트 오일러 KR 1번.


1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면?



문제 출처.

http://euler.synap.co.kr/prob_detail.php?id=1



요점.

제목만 보아도 알 수 있듯이 그냥 그 배수 들을 다 더하면된다.

다만, 3과 5의 공배수를 2번 더하지 않도록 주의하자.




풀이 방법.

1) 이건 1부터 1000까지 훑어가면서 3으로 나누어 떨어지거나, 5로 나누어 떨어지면

이때까지 더했던 변수(sum)에 더한다.


2) "n(n+1)/2"  

즉 합의 공식을 이용해 

"3의 배수 합 + 5의 배수 합 - 15의 배수로 구하여도 된다."




코드 해석.

코드만 봐도 해석은 될 수 있을 것 같다.




요약.

겹치는 수에 대해 주의하자.

댓글

Pmon

뭐든 간에 기록하자

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment

VISITED

Today :

Total :