题目描述
分析
很明显的一道搜索题,只需要特判1(2(0))和2(2)就行了。在搜索里面,用一个bool型变量判断前面是否要加上‘+’,然后继续搜下一层。我们用一个栈,每次将目标数字/2,栈里面存余数,如果是2的倍数就不再分解了(分解不了)。但是,递归调用次数会很多,所以采用记忆化搜索,每搜索完用数组记下结果,在递归开头判断是否被搜过就行了
代码
#include<bits/stdc++.h>
using namespace std;
string num[2000007];
string solve(int n)
{
if(num[n]!="") return num[n];
string ans;
stack<int> s;
int m=n;
while(m)
{
s.push(m%2);
m/=2;
}
bool b=0;
for(int i=s.size();i>=1;i--)
{
m=s.top();
s.pop();
if(m!=0)
{
if(!b) b=1;
else ans+='+';
if(i==1) ans+=num[1];
else if(i==2) ans+=num[2];
else ans+="2("+solve(i-1)+")";
}
}
num[n]=ans;
return num[n];
}
int main()
{
int n;
cin>>n;
num[1]="2(0)";
num[2]="2";
cout<<solve(n);
}