Green55   2년 전

왜 런타임 에러가 뜨는지 ..

제가 현재 쓰는 컴파일러는 배열 범위가 좀만 커도 뻗어버려서, 범위좀 줄이고 테스트 해봤는데 문제 없이 작동 하네요

백만정도면 문제 없는 범위 아닌가요?

--

(댓글이 안달려서 이렇게 글 수정으로 남깁니다.)
@emiyagugizzada  

지적하신대로 11번째줄의 오버플로우가 문제였습니다. 

long long j = (long long) i*i; 로 수정하니 성공했습니다.

당연히 1000000 내에서만 접근 할 줄 알았는데 이런곳에서 실수를 해버렸네요. 감사합니다!


덧붙이자면 i^2 미만의 소수가 아닌 수는 이미 i 미만에서 걸러졌기 때문에, j=i*i 자체는 정당한 알고리즘입니다.

[ex : 11*2는 2에서, 11*3은 3에서, 11*4 = 11*2*2 = 2에서..]

골드바흐의 추측은 충분히 작은 숫자에서 참인것이 널리 알려져있기 때문에, 굳이 예외 처리를 하지 않고 23번째 줄은 무한루프를 돌려도 통과하였습니다.


11번째 줄의 j=i*i가 애초에 제대로 된 정답을 내지 못할 뿐만 아니라 int 범위를 초과해 이상한 값(엄청 큰 값이 들어가면 다행히 저 for문을 실행하지 않지만 음수가 들어가버리면 뻗겠네요.)이 들어가서 당장 제 로컬환경에서 돌려도 제대로 실행이 되지 않아요.


그리고 23번 줄에서도 i가 음수로 떨어졌을 때에 대한 처리가 없네요.

아 맞네요 i*i부터 하면 되는군요 저도 덕분에 좋은거 배워갑니다ㅎㅎ

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