最大只有2的14次方,找到规律直接打表。
#include <string>
#include <map>
#include <vector>
#include <stdio.h>
#include <cmath>
using namespace std;
int main()
{
map<int,string> list;
vector<int> first;
int i,n;
string ans;
list.insert(pair<int,string>(0,"2(0)"));
list.insert(pair<int,string>(1,"2"));
list.insert(pair<int,string>(2,"2(2)"));
list.insert(pair<int,string>(3,"2(2+2(0))"));
list.insert(pair<int,string>(4,"2(2(2))"));
list.insert(pair<int,string>(5,"2(2(2)+2(0))"));
list.insert(pair<int,string>(6,"2(2(2)+2)"));
list.insert(pair<int,string>(7,"2(2(2)+2+2(0))"));
list.insert(pair<int,string>(8,"2(2(2+2(0)))"));
list.insert(pair<int,string>(9,"2(2(2+2(0))+2(0))"));
list.insert(pair<int,string>(10,"2(2(2+2(0))+2)"));
list.insert(pair<int,string>(11,"2(2(2+2(0))+2+2(0))"));
list.insert(pair<int,string>(12,"2(2(2+2(0))+2(2))"));
list.insert(pair<int,string>(13,"2(2(2+2(0))+2(2)+2(0))"));
list.insert(pair<int,string>(14,"2(2(2+2(0))+2(2)+2)"));
scanf("%d",&n);
for(i=14;i>=0;i--)
{
if(int(pow(2,i))<=n)
{
first.push_back(i);
n-=int(pow(2,i));
}
}
for(i=0;i<first.size();i++)
{
ans+=list[first[i]];
if(i!=first.size()-1)
ans+="+";
}
cout<<ans<<endl;
return 0;
}