2023년 11월 22일 수요일

C++(Algorithm) - 콜라츠

 


문제대로 500번 이내에 계산이 되면 횟수를 출력하면 된다. (넘어가면 -1)



간단하게 C로 만들어 보았는데

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
int solution(int num1) {
    unsigned long long answer = num1;
 
    for (int i = 0; i < 500; i++)
    {
        if (answer == 1)
            return i;
 
        if (answer % 2 == 0)
        {
            answer /= 2;
 
        }
        else
        {
            answer = answer * 3 + 1;
        }
    }
 
    return -1;
}
 
void main()
{
    printf("%d\n", solution(626331));
}
cs

이런 결과가 나온다.


그런데 626331의 경우에 처음에 answer 변수의 타입을 int로 했었다.

그럼 488번째 for문에서 1이 되는데, 답이 달라서 해답을 찾아봤다. 

곱셈 연산쪽에서 오버플로우가 발생한다고 long 타입을 사용하라 해답에 있었지만

그냥 long으로도 안돼서 그냥 더 큰 더블 Long으로 해결하였음



댓글 없음:

댓글 쓰기

c++ thread.h

 c++에서 쓰레드 돌릴려면 thread.h 헤더를 쓰면 되는데 이 친구는 쓰레드가 아직 실행 중인지, 아니면 강제 종료하거나 하는 함수가 없어서 조금 아쉬운 애다. std::thread 는 로컬 변수로 선언하든 new 동적 할당을 하든 start 함...