본문 바로가기

백준

10826 피보나치 수 4

피보나치 그대로 값 계산했다가 틀린 문제ㅠ

 

10000 넣으니 음수가 나온 걸로 보아 오버플로우가 난 것 같다.

 

i64를 해도 문제니 덧셈을 문자열로 처리할 수 밖에 없었다. 

 

문자열 덧셈은 많이 짜봐서 빠르게 짰음

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>

#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()

using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;

using namespace std;

string  string_sum(string a, string b)
{
    string res = "";
    int carry = 0;

    reverse(all(a));
    reverse(all(b));


    for (int i = 0; i < min(a.size(), b.size()); i++)
    {
        int ta = a[i] - '0';
        int tb = b[i] - '0';

        res += (ta + tb + carry) % 10 + '0';
        carry = (ta + tb + carry) / 10;
    }

    if (a.size() < b.size())
    {
        for (int i = min(a.size(), b.size()); i < b.size(); i++)
        {
            int tb = b[i] - '0';

            res += (tb + carry) % 10 + '0';
            carry = (tb + carry) / 10;
        }
    }
    else
    {
        for (int i = min(a.size(), b.size()); i < a.size(); i++)
        {
            int ta = a[i] - '0';

            res += (ta + carry) % 10 + '0';
            carry = (ta + carry) / 10;
        }
    }

    if (carry != 0)
        res += carry + '0';

    reverse(all(res));

    return res;
}

int     main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int n;
    cin >> n;

    vector<string> v(n + 1);
    v[0] = "0";
    v[1] = "1";

    for (int i = 2; i <= n; i++)
    {
        v[i] = string_sum(v[i - 1], v[i - 2]);
    }

    cout << v[n];

    return 0;
}

 

엇... 그런데 런타임 에러가 떴다???

 

혹시나 싶어서 작은 수 넣는데 0에서 문제가 생겼다

 

알고보니 v(n + 1)로 배열을 만들었더니 n이 0일 때 v[1]에 접근해서 문제였다.

 

그래서 v + 5로 만들었음

 

해결! 

'백준' 카테고리의 다른 글

14624 전북대학교  (0) 2020.10.06
17300 패턴 [미완]  (0) 2020.10.04
2670 연속부분최대곱  (0) 2020.09.28
2563 색종이  (0) 2020.09.28
18221 교수님 저는 취업할래요  (0) 2020.09.28