Description
给定一个数字串,确定它是否是“和字符串”。若一个最右边的子串可以写成前面两个子串的和,并且前面的子串递归地也是这样,那个么字符串S就称为和字符串。用回溯法求解。
以下函数为两个数字字符串求和,和值转换为字符串输出的函数,可以用于该题求解。
string string_sum(string str1, string str2)
{
if (str1.size() < str2.size())
swap(str1, str2);
int m = str1.size();
int n = str2.size();
string ans = "";
// sum the str2 with str1
int carry = 0;
for (int i = 0; i < n; i++) {
// Sum of current digits
int ds = ((str1[m - 1 - i] - '0') +
(str2[n - 1 - i] - '0') +
carry) % 10;
carry = ((str1[m - 1 - i] - '0') +
(str2[n - 1 - i] - '0') +
carry) / 10;
ans = char(ds + '0') + ans;
}
for (int i = n; i < m; i++) {
int ds = (str1[m - 1 - i] - '0' +
carry) % 10;
carry = (str1[m - 1 - i] - '0' +
carry) / 10;
ans = char(ds + '0') + ans;
}
if (carry)
ans = char(carry + '0') + ans;
return ans;
}
Input
输入第一行整数n为字符串个数
之后输入n行,每行一个数字字符串
Output
输出有n行,每行对应的字符串如果是和字符串,则输出为1,否则输出为0。末行有 换行
样例解析
输入2个字符串,第一个字符串可以分为:12 + 24 = 36,24 + 36 = 60 为和字符串,因此输出为1
第二个字符串不是和字符串,因此输出为0
Sample Input 1
2 12243660 2368
Sample Output 1
1 0
#include <iostream>
#include <string>
using namespace std;
string string_sum(string str1, string str2) {
if (str1.size() < str2.size())
swap(str1, str2);
int m = str1.size();
int n = str2.size();
string ans = "";
int carry = 0;
for (int i = 0; i < n; i++) {
int ds = ((str1[m - 1 - i] - '0') + (str2[n - 1 - i] - '0') + carry) % 10;
carry = ((str1[m - 1 - i] - '0') + (str2[n - 1 - i] - '0') + carry) / 10;
ans = char(ds + '0') + ans;
}
for (int i = n; i < m; i++) {
int ds = (str1[m - 1 - i] - '0' + carry) % 10;
carry = (str1[m - 1 - i] - '0' + carry) / 10;
ans = char(ds + '0') + ans;
}
if (carry)
ans = char(carry + '0') + ans;
return ans;
}
bool isSumString(string str, int start, string s1, string s2) {
if (start == str.length())
return true;
string sum = string_sum(s1, s2);
int sumLen = sum.length();
if (str.substr(start, sumLen) == sum)
return isSumString(str, start + sumLen, s2, sum);
else
return false;
}
int main() {
int n;
cin >> n;
while (n--) {
string str;
cin >> str;
int len = str.length();
for (int i = 1; i < len; i++) {
for (int j = 1; j < len - i; j++) {
string s1 = str.substr(0, i);
string s2 = str.substr(i, j);
if (isSumString(str, i + j, s1, s2)) {
cout << "1" << endl;
goto next;
}
}
}
cout << "0" << endl;
next:;
}
return 0;
}