# [306. Additive Number](https://leetcode.com/problems/additive-number/)
# 思路
定义一种加法序列：除前两个数外，每个数字都是其前面两个数字的和。题目要求一个字符串序列是否可以分割成一个加法序列。

这题其实没有很好的方法，就是brute force。因为加法序列有一个特点：一旦前两个数确定了，那么后面每个数就确定了。所以我们暴力枚举前两个数的所有情况，然后再
不断得到下一个数的值并判断得到的字符串是否和目标串相同，若是则返回True。由于follow up说了要处理int整数溢出的情况，所以我们可以使用long long型，或者自己写一个大数相加的函数（就是题[415. Add Strings](https://leetcode.com/problems/add-strings/)）。

# C++
``` C++
class Solution {
private:
    string big_add(string n, string m){ // 大数相加
        string res;
        int i=n.size() - 1, j= m.size() - 1, carry = 0;
        while(i>=0 || j>=0){
            int sum=carry+(i>=0 ? (n[i--]-'0') : 0) + (j>=0?  (m[j--]-'0') : 0);
            res.push_back(sum % 10+'0');
            carry=sum/10;
        }
        if(carry) res.push_back(carry+'0');
        reverse(res.begin(), res.end());
        return res;
    }
public:
    bool isAdditiveNumber(string num) {
        int len = num.size();
        for(int i = 1; i <= len / 2; i++){
            if(num[0] == '0' && i > 1) continue; // 前导0
            for(int j = 1;j <= len / 2; j++){
                if(num[i] == '0' && j > 1) continue; // 前导0
                string num1_str = num.substr(0, i);
                string num2_str = num.substr(i, j);
                string accum_str = num1_str + num2_str;
                
                if(accum_str != num.substr(0, accum_str.size())) continue;
                while(accum_str.size() < len){
                    // string num3_str = to_string(stol(num1_str) + stol(num2_str));
                    string num3_str = big_add(num1_str, num2_str);
                    
                    if(num3_str != num.substr(accum_str.size(), num3_str.size())) break;           
                    accum_str += num3_str;
                    if(accum_str.size() == len) return true;
        
                    num1_str = num2_str;
                    num2_str = num3_str;
                }
            }
        }
        return false;
    }
};
```
