最大只有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;
}