karoshi   6년 전

소스에 주석을 달았는데요

for(i=2; i<=second_input; i++)조건일시 런타임 에러가 떠서

for(i=2; i<=second_input; i++)  이조건을 -> for(i=2; (i*i)<=second_input; i++) 

로 바꾸니까 런타임 에러가 안뜨고 실행이 잘됩니다.

처음 조건은 전혀 상관이 없다고 생각했는데 뭐가 문제인지 잘모르겠습니다..

chogahui05   6년 전

아마도 25번째 줄에 printf문 대신에 arr[j] = ??

이런 게 들어갔으리라 생각하는데요. 그러니까 런타임이 떴겠죠..

저 코드만 봐서는 런타임이 뜰 이유조차 없습니다.


i가 100만일 때 23번째 줄은 karo님의 의도대로 잘 동작할까요? 아니면 이상하게 동작할까요?

karoshi   6년 전

아 편집을 잘못했습니다

25번째 줄엔

printf문이아니라 arr[j] = 0;

이 코드가 들어가야됩니다.

런타임 에러가뜨는데 이유를 잘 모르겠습니다.  10000까지는 문제없이 실행되는데

10만과 100만은 문제가 되더라구요...


djm03178   6년 전

int형의 수 100만 * 100만은 얼마일까요?

karoshi   6년 전

100억입니다.

chogahui05   6년 전

음.. 일단 다른 건 모르겠고요..

확실한 건 오버플로우 때문에 karo님이 의도한 것과는 많이 다른 동작을 수행한다는 거죠..


아마도.. 질문에 올려주신 코드가 원본 코드가 아닐 거라고 생각합니다.

체 알고리즘 특성상, 분명히 arr[j] = ~~ 와 같은 문장이 들어갔을 거고요.


문제는 이 j가 의도치 않게 -값이 되어 버렸을 때에는

허가되지 않은 공간에 접근한다는 것이죠.. 프로그래밍 할 때 가장 주의해야 할 점이

이런 것인데요. 다른 커뮤니티에서도 답변하다 보면.. 이런 경우를 정말 많이 봐 왔습니다..

karoshi   6년 전

이해가 잘 안가지만...다시 한번 체크 해보겠습니다 답변주셔서 감사합니다!

djm03178   6년 전

일단 100만 * 100만은 100억이 아니라 1조인데요, 어느 쪽이든 상관 없습니다.

중요한 건 채점 서버의 환경에서 int는 32비트 정수형이라는 것이고, 32비트 정수형이 표현할 수 있는 정수의 범위는 약 -21억 ~ +21억밖에 안 됩니다.

이보다 큰 수가 계산 결과가 된다면 오버플로라는 것이 발생하는데, 이 때의 동작은 시스템마다 다릅니다. 일반적으로는 하위 32비트의 구성만 유지시킨 채로 진행이 되는데, 그렇기 때문에 1조가 j의 값이 되는 것이 아니라 전혀 무관한 이상한 값이 들어가게 됩니다. 심지어는 이게 음수가 될 수도 있는 거고요.

음수가 된 상태에서 arr[j]에 접근하게 되면 당연히 잘못된 접근으로 런타임 에러가 발생하게 됩니다.

karoshi   6년 전

아하! 제가 두번째 for문 조건을 보고 second_input에 해당안되기때문에 문제가 없을꺼라고 계속 생각했었는데

범위가 문제였다는걸 모르고있었습니다. 답변 정말 감사합니다!

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