题目描述:
任何一个正整数都可以用2的幂次方表示。例如137=++。
同时约定方次用括号来表示,即可表示为a(b)。
由此可知,137可表示为2(7)+2(3)+2(0)
进一步:
7=+2+(用2表示),并且3=2+。
所以最后137可表示为2(2(2)+2+2(0))+2(2+2(0))+2(0)。
又如1315=++ +2+1
所以1315最后可表示为2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)。
输入格式:
一行一个正整数n。
输出格式:
符合约定的n的0, 2表示(在表示中不能有空格)。
样例 #1
样例输入 #1
1315
样例输出 #1
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
【数据范围】
对于100%的数据,1≤n≤2×。
分析:
这道题其实就是对一个数用2的幂进行分解,既然说了数字的范围时1-->20000,那么对其列个表格就行了
1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
... | |||||||
256 | 1024 | 2048 | 4196 | 8192 | 16384 | 32768 | ... |
我们将所有可以用到的2的幂列举出来了,然后就是按递归的方法去减就行了,但要注意2()的括号里面的数能分解的也要分解,那么就可以做了。
你们最爱的代码:
#include <bits/stdc++.h>
using namespace std;
int a[16];
void f(int x)
{
for(int i=15;i>=0;i--)//倒着找最大最接近x的
{
if(x>=a[i])//如果2的i次方小于或等于
{
x-=a[i];//减去2的i次方
if(i==0) printf("2(0)");
else if(i==1) printf("2");//两个特判
else
{
printf("2(");
f(i);
printf(")");
}
if(x>0) cout<<"+";//输出条件
}
}
}
int main()
{
a[0]=1;
for(int i=1;i<=15;i++) a[i]=a[i-1]*2;//将2的i次方存进数组里
int n;
cin>>n;
f(n);//递归开始
return 0;
}
看完了,你学费了吗?
验证方法:洛谷P1010 [NOIP1998 普及组] 幂次方直接AC
有问题欢迎在评论区讨论!!