C++ 큰 수 더하기(feat. 백준(boj)10826 - 피보나치 수 4)
업데이트:
문제 링크 - https://www.acmicpc.net/problem/10826
👀문제이해 및 풀이방법
가끔가다 문제를 풀면 long long 형을 뛰어넘는 수가 나올때가 있다. 어지간하면 mod로 이러한 문제를 체크해주기도 하지만
큰 수를 구현하라는 문제가 대부분이다 파이썬을 쓰면 된다고 하지만 c++로 해결할 수 있어야 한다
보통은 bigint라는 구조체를 만들어 operator를 오버라이딩 해서 string형을 더하는 형식으로 데이터타입을 만든다
하지만 1주일만 지나고 다시 풀어보면.. operator를 오버라이딩 하는 문법이 기억이 나지 않아 또 검색을 해보게된다
이번에도 똑같이 string을 더하는 operator를 만드려고 했는데 왠걸 string을 더하는 함수하나 만들어서 푼 풀이를 보게되었다
앞으로 큰 수가 나오면 나도 그냥 string을 더하는 함수를 만들어서 풀어야 겠다
📝코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class fibo{
private:
vector<string> dp;
int N;
public:
fibo(){
std::cin >> N;
dp.resize(3);
dp[0]="0";
dp[1]="1";
}
string sum(string x, string y)
{
int num;
int carry = 0;
string result;
reverse(x.begin(), x.end());
reverse(y.begin(), y.end());
while (x.length() < y.length()) {
x += '0';
}
while (x.length() > y.length()) {
y += '0';
}
for (int i = 0; i < x.length(); ++i) {
num = (x[i] - '0' + y[i] - '0' + carry) % 10;
result += to_string(num);
carry = (x[i] - '0' + y[i] - '0' + carry) / 10;
}
if (carry != 0) {
result += to_string(carry);
}
reverse(result.begin(), result.end());
return result;
}
void DP(){
if(N<2)
std::cout << dp[N]<<'\n';
for(int i=2;i<=N;i++){
dp[2]=sum(dp[0],dp[1]);
dp[0]=dp[1];
dp[1]=dp[2];
}
std::cout << dp[2] << '\n';
}
};
int main(){
cin.tie(NULL);cout.tie(NULL);
ios_base::sync_with_stdio(false);
fibo fi;
fi.DP();
return 0;
}
정말.. 큰수 문제는 문제 난이도보다 풀기가 싫어진다.. ㅠㅠ
댓글남기기