C:〖NOIP1998〗2的幂次方
描述
任何一个正整数都可以用2的幂次方表示。例如:137=27+23+20。
同时约定方次用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=210 +28 +25 +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
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
分析:
对于这题的思路,
一开始我就在想,
可不可以先把它化为2进制,
然后使用找规律的方法,
依次填入string,
用函数递归递推来完成,
2进制的方法我首先找到了,
用一个a数组来存储,
过程自然不必多说,
while (m>0) {
a[js++]=m%2;
m/=2;
}
后来在杨老师程序的基础上,
我发现,在化二进制之前,
可以先进行特殊性判断,
如果这个数为0,string中直接填入0;
如果这个数为2,string中直接填入2;
进行化二进制之后,
也就是等于判断奇偶,
for (int i=js-1;i>=0;i--)
if (a[i]!=0){
if (i!=1){
if (i==js-1) ans=ans+"2("+work(i)+")";
else ans=ans+"+2("+work(i)+")";
}
else {
if (i==js-1) ans=ans+"2";
else ans=ans+"+2";//连接式子
}
}
}
最后return ans