xorms86   3년 전

문제에서 최대 입력값이 4,294,967,295 이고, unsigned int의 최댓값도 4,294,967,295 이여서 l, r, result를 unsigned int로 선언하였습니다. 

입력으로 4,294,967,294까지는 92681이라는 출력값이 잘나오는데 4,294,967,295를 넣으면 제대로된 답이 안나오더라고요.

12번줄인 (l+r), 즉 ( 1+4,294,967,295)로 인해 오버플로우가 발생하는것 까지는 알아냈는데 코드를 어떻게 수정해야할지를 모르겠습니다.

l, r, result의 자료형은 unsigned int로 그대로 두면서 12,13번줄에서 오버플로우가 안나도록 하려면 어떻게 형변환을 해줘야 할까요? 

ex) (long long)(l+r)/2; -> 여전히 답이 안나오는 코드

39dll   3년 전

unsigned int끼리의 연산 결과 type은 unsigned int입니다. 그렇기 때문에 (long long)(l+r)/2과 같이 쓰면 l+r인 시점부터 이미 오버플로우가 납니다.

아래와 같이 쓰면 됩니다.

xorms86   3년 전

@39dll 한틱차이가 엄청난 차이군요.. 감사합니다

댓글을 작성하려면 로그인해야 합니다.