2的幂次方(power)
题目描述
任何一个正整数都可以用2的幂次方表示。例如:
137=2+2+2
同时约定方次用括号来表示,即a 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=2+2+2 (21用2表示)
3=2+2
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2 +2 +2 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入
输入:正整数(n≤20000)
输出
输出:符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
1315
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
分析:递归
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <ext/rope>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define vi vector<int>
#define pii pair<int,int>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e5+;
const int dis[][]={{,},{-,},{,-},{,}};
using namespace std;
using namespace __gnu_cxx;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p;p=p*p;q>>=;}return f;}
int n,m;
void work(int now)
{
if(now==){printf("2(0)");return;}
else if(now==){printf("");return;}
int p=,q=;
while(p<=now)q++,p<<=;
q--,p>>=;
if(p==now)
{
printf("2(");
work(q);
printf(")");
}
else
{
if(p==)printf("2+");
else
{
printf("2(");
work(q);
printf(")+");
}
work(now-p);
}
}
int main()
{
int i,j,k,t;
while(~scanf("%d",&n))
{
work(n);
printf("\n");
}
//system ("pause");
return ;
}