[백준] 피보나치수 2 C++
in Study on Coding Test
C++의 정수자료형 사용을 주의해야 할 것.
정답제출코드
#include <iostream>
using namespace std;
int main()
{
long long a1, a2, a3;
unsigned int n;
cin >> n;
a1 = 0;
a2 = 1;
if (n == 0)
{
cout << 0;
return 0;
}
else if (n == 1)
{
cout << 1;
return 0;
}
for (int i = 2; i <= n; i++)
{
a3 = a1 + a2;
a1 = a2;
a2 = a3;
}
cout << a3;
system("pause");
return 0;
}
시행착오 과정
이전 제출 코드 (오답)
#include <iostream>
using namespace std;
int main()
{
int a1, a2, a3;
int n;
cin >> n;
a1 = 0;
a2 = 1;
if (n == 0)
{
cout << 0;
return 0;
}
else if (n == 1)
{
cout << 1;
return 0;
}
for (int i = 2; i <= n; i++)
{
a3 = a1 + a2;
a1 = a2;
a2 = a3;
}
cout << a3;
system("pause");
return 0;
}
일부 테스트 케이스를 돌렸을 땐(n = 5, n = 10 등) 정상적으로 출력되는 것이라고 생각했었다..
그래서 맞왜틀..?을 시전하면서 10분 정도를 고민했던 것 같다.
이때, 문제를 다시한번 읽어보니 n은 90이하의 자연수라고 했다.
그래서 n에다가 90을 넣어보았더니
-1581614984
음수 값이 나오는 것이다.
아차차! int의 표현 범위는 -2147483648 ~ 2147483647 까지 였다.
(-2^31 ~ 2^31 - 1)
그래서 자료형을 int에서 long long 으로 바꾸었다. 넉넉하게!
그랬더니 정답으로 체크되었다.
파이썬을 했다가 C++을 새로 공부하니 이런 실수가 발생했던 것 같다.
이번 실수를 기억해두기 위해서 이 글을 써보았다.