Problem
https://codeup.kr/problem.php?id=1091
Solution
오답코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int fibo(int a, int m, int d, int n)
{
if (n==1)
return a;
else
return fibo(a, m, d, n-1)*m+d;
}
int main()
{
int a, m, d, n;
scanf("%d%d%d%d",&a,&m,&d,&n);
printf("%d",fibo(a, m, d, n));
}
처음 이 문제를 풀었을 때는 각 변수의 조건 (a, m, d는 -50 ~ +50, n은 10이하의 자연수)
을 크게 신경쓰지 않았다. 그랬더니 테스트케이스로 -50 50 -50 10
이 입력되었을 때 원래 정답인 -99649234693877550
이 나오는 대신 -1947299630
이 나와 오답처리 되었다. 따라서 fibo함수의 반환형을 long long
형으로 바꿔주었다.
정답코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
long long fibo(int a, int m, int d, int n)
{
if (n==1)
return a;
else
return fibo(a, m, d, n-1)*m+d;
}
int main()
{
int a, m, d, n;
scanf("%d%d%d%d",&a,&m,&d,&n);
printf("%lld",fibo(a, m, d, n));
}
이렇게 바꾸니 정답처리가 되었다.
Memo
이 문제를 for문으로 처리할 수도 있었지만 함수를 따로 빼서 피보나치형태로 처리해보았다. 수열의 순서를 나타내는 n이 1일때 a를 return하는 식으로 피보나치 함수를 실행시키면 n번째 수를 구할 수 있다. for문으로 해결한다면 아래와 같이 해결할 수 있을 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
int a, m, d, n;
long long res = 0;
scanf("%d%d%d%d",&a, &m, &d, &n);
for (int i=0; i<n; i++)
res = res * m + d;
printf("%lld", res);
}