#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
string Add(string a1, string a2)
{
string resTrue;
int len1 = a1.size();
int len2 = a2.size();
//处理进位
int x = 0;
for (int i = 1; i <= min(len1, len2); i++)
{
int rs = (a1[a1.size() - i] - '0') + (a2[a2.size() - i] - '0') + x;
x = 0;
int tmp = rs % 10;
resTrue = (to_string(tmp)) + resTrue;
if (rs >= 10)
{
x = 1;
}
else
{
x = 0;
}
}
string tmp = a1;
if (len1 < len2)
{
tmp = a2;
}
string a = tmp.substr(0, abs(len2 - len1));
if (x == 1)
{
a = to_string(atoi(a.c_str()) + x);
}
a = a + resTrue;
return a;
}
bool Search(string num, string a1, string a2)
{
if (num == "")
{
return true;
}
int t = max(a1.size(), a2.size());
if (t > num.size())
{
return false;
}
if ((a1[0] == '0' && a1.size() > 1) || (a2[0] == '0' && a2.size() > 1))
{
return false;
}
bool ans = false;
int len1 = a1.size();
int len2 = a2.size();
//判断是否相等
for (int i = 0; i < 2; i++)
{
string tmp = num.substr(0, t + i);
if (Add(a1, a2) == tmp)
{
ans = Search(num.substr(t + i), a2, tmp);
break;
}
}
return ans;
}
bool isAdditiveNumber(string num) {
if (num.size() < 3)
{
return false;
}
bool ans;
for (int i = 1; i < num.size() - 1; i++)
{
for (int j = i + 1; j < num.size(); j++)
{
cout << num.substr(j) << " " << num.substr(0, i) << " " << num.substr(i, j - i) << endl;
ans = Search(num.substr(j), num.substr(0, i), num.substr(i, j - i));
if (ans)
{
return true;
}
}
}
return false;
}
爆搜+字符串加法模拟(溢出必须要用这个)
边界处理把我杀了吧,捏马马滴