tjdgns9246   7년 전

예제도 맞게 나오고.. MAX(a, b) 함수에서 input값의 조건으로 인해

어차피 양수가 나올거라 생각하고 간단하게 캐스팅해줬는데 오답이 뜨네요

어디가 잘못된건지 알 수 있을까요..? ㅠㅠ

tjdgns9246   7년 전

n = 1일 경우가 안되서 다시 수정했는데 또 틀렸다고 뜨네요... ㅠㅠ..

unused   7년 전

1 + 8 * k에서 오버플로가 발생합니다. 1 + 8LL * k로 고쳐보세요

tjdgns9246   7년 전

@unused 님, 왜 1 + 8 * k에서 오버플로가 발생하나요?

아마 sqrt()에 double형을 인자로 받아서 그런가요...?

만약 그렇다면 k자체가 오버플로가 발생해서 1 + 8LL * k 도 결국은 오버플로가 발생하지 않나요?

1 + 8LL * k가 의미하는 바가 뭔지 모르겠습니다..ㅠㅠ

unused   7년 전

1 + 8 * k는 unsigned인데 k가 최대 42억까지 커질 수 있으니까 k에 8을 그냥 곱하면 unsigned의 범위를 넘어서 오버플로가 발생하죠.  8LL은 long long 타입으로 64비트 정수라 8LL * k는 오버플로가 일어나지 않습니다.

tjdgns9246   7년 전

@unused

아하...!! 그럼 sqrt()안에 double형이 인자로 들어가는데 1 + 8LL * k 같이 long long 타입을 대입시켜도 무관하나요?

tjdgns9246   7년 전

@unused님... 죄송하지만 사소한 질문하나 더 드리겠습니다... ㅎㅎ;

맨 처음 포스팅한 소스에서는 n == 1일 경우가 되지 않아서 혹시나 하고 temp 라는 변수에다가 대입을 시켰습니다.

그러니 n == 1일 경우가 작동이 되던데...

왜 n == 1일 경우에 printf()안에서 더하기 연산을 하면 리턴값이 제대로 나오지 않았는지 알 수 있을까요?

그리고 답변 감사합니다!! 덕분에 큰 도움이 됬습니다. ㅎㅎㅎ

unused   7년 전

MAX(temp1, temp2) + 0.5를 풀면 ((temp1) > (temp2)) ? (temp1) : (temp2) + 0.5인데 +가 ?:보다 우선순위가 높아서 (temp1 > temp2) ? temp1 : (temp2 + 0.5)처럼 해석되기 때문에 답이 안 나옵니다. MAX 매크로 전체에 괄호를 씌워주셔야 합니다: #define MAX(a, b) (((a) > (b))? (a) : (b))

그리고 double은 유효숫자가 15자리정도 되는데요, 이 문제에서는 1 + 8LL * k가 아무리 커봤자 11자리 정도가 한계여서 괜찮습니다.

tjdgns9246   7년 전

@unused님 정말 감사합니다... ㅠㅠ 너무 똑똑하신 것 같아요.

어떻게 하면 그런 지식을 쌓는지.. 부럽네요. 다시 한 번 감사합니다!

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