sym9505   4년 전

1도 출력되는데 어디가틀린건지 도통모르겠네요...ㅠ

evenharder   4년 전

여러 가지 테스트(C++14 기준)를 해보면서 BOJ 채점 환경에서 long이 8바이트인 것도 확인하고, %li로 입력이 잘 되는 것도 확인하였습니다.

n이 1일 때 while문을 돌리지 않고 바로 1을 출력하고 프로그램을 종료하니까 맞았습니다가 나왔는데, while을 돌리고 n이 1일 때 1을 출력하라고 하니까 97%에서 틀렸습니다를 받았습니다.

일단 맞았습니다를 위해서는 입력받고 while문을 돌리지 않고 바로 n이 1일 때 1을 출력하고 프로그램을 종료하는 게 좋아보입니다.

다만, 왜 while문을 n이 1일 때 돈다고 해서 시간 초과도 아닌 틀렸습니다가 나오는지는 잘 모르겠습니다.

evenharder   4년 전

찾아보니 "a program with endless recursion or endless loop (whether implemented as a for-statement or by looping goto or otherwise) has undefined behavior."라는 문구가 있네요. 제 생각에는 저 while문이 매우 이상하게 최적화 또는 변형되어서, n에 1이 들어가면 n의 값이 수정되는 방향으로 컴파일되는 것 같습니다.

이 페이지의 'Infinite loop without side-effects'를 보시면 참으로 증명된 페르마의 마지막 정리에 대해 '반례'가 있다고 주장하는 C++ 코드가 나와 있습니다.

저도 C++ 문법은 잘 알지 못해, 다른 고수 분들의 답변을 기다려야 할 것 같습니다.

sym9505   4년 전

대충이해했습니다!! 덕분에 해결했네요 감사드립니다 ㅎㅎ

kcm1700   4년 전

n=1이면 signed integer overflow가 있는 걸로 보이네요. 이게 아직 UB일 거 같네요

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