본문 바로가기

Algorithm/BAEKJOON

[BOJ] 10826번 피보나치 수 4 (C++)

728x90
반응형

https://www.acmicpc.net/problem/10826

 

10826번: 피보나치 수 4

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int n;
string dp[10001];

string big_num_sum(string a, string b){
	int sum;
	string s;
	vector<int> v, num1, num2;
	
	if(a.size() < b.size()){
		string tmp = a;
		a = b;
		b = tmp;
	}
	
	num1.push_back(0);
	num2.push_back(0);
	
	for (int i = 0; i < a.size() - b.size(); i++)
		num2.push_back(0);
		
	for(int i = 0; i < a.size(); i++)
		num1.push_back(a[i] - '0');
		
	for(int i = 0; i < b.size(); i++)
		num2.push_back(b[i] - '0');
		
	for(int i = a.size(); i > 0; i--){
		sum = num1[i] + num2[i];
		if(sum >= 10){
			num1[i - 1]++;
			sum -= 10;
		}
		v.push_back(sum);
	}
	
	if(num1.front() != 0) s.push_back('1');
	
	for(int i = v.size() - 1; i >= 0; i--){
		s.push_back(v[i] + 48);
	}
	
	return s;
}

int main() {
	cin >> n;
	
	dp[0] = '0'; dp[1] = '1';
	
	for(int i = 2; i <= n; i++){
		dp[i] = big_num_sum(dp[i - 1], dp[i - 2]);
	}
	
	cout << dp[n];
	return 0;
}

입력이 커질수록 수의 크기가 기하급수적으로 증가하므로 문자열 배열로 저장하여 큰 수들의 덧셈을 처리하였다.

큰 수 연산에 대한 설명은 10757번 문제 참고

728x90
반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[BOJ] 2644번 촌수계산 (C++)  (0) 2022.01.28
[BOJ] 1914번 하노이 탑 (C++)  (0) 2022.01.13
[BOJ] 10757번 큰 수 A+B (C++)  (0) 2022.01.11
[BOJ] 1010번 다리 놓기 (C++)  (0) 2022.01.10
[BOJ] 9461번 파도반 수열 (C++)  (0) 2022.01.09