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;
}

image
정말.. 큰수 문제는 문제 난이도보다 풀기가 싫어진다.. ㅠㅠ

댓글남기기