#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#define ENTER printf("\n");
#define MOD 1000000007
//快速打印一个数组
#define ll long long
#define NUM 1000
using namespace std;
//构造函数 析构函数怎么打印出地址
char str[12+1];
ll n;
int ans;
int len;
ll string_to_ll(int p, int q)//把str[p...q]转换为相应的长整型
{
ll ans = 0;
for (int i = p; i <= q; i++)
{
ans *= 10;
ans += (str[i] - '0');
}
return ans;
}
void dfs(int index, ll* sum) //从str[index]开始进行递归(str[index]不包含在已经递归的部分内),递归前的和为*sum
{
//printf("当前的状态为index=%d,sum=%lld\n", index, *sum);
if (index > len-1)
{
if (*sum == n)
ans++;
return;
}
for (int i = index; i <= len - 1; i++)
{
ll t = string_to_ll(index, i);
//做加法
*sum += t;
dfs(i + 1, sum);
*sum -= t;
//做减法
*sum -= t;
dfs(i + 1, sum);
*sum += t;
}
}
int main()
{
while (scanf("%s%lld", str, &n) != EOF)
{
ll sum = 0;
ans = 0;
len = strlen(str);
for (int i = 0; i < len; i++)
{
ll t = string_to_ll(0, i);
sum += t;
dfs(i + 1, &sum);
sum -= t;
}
//printf("ans=%d\n", ans);
printf("%d\n", ans);
}
return 0;
}
此代码还可以优化string_to_ll的部分可以放到dfs的循环中,因为假设1234
上一次递归使用的是123,下一次递归使用的是1234,就是ans*10+4
回溯部分也可以不使用指针,直接用dfs(index,sum+temp/sum-temp)就可以