题目:
描述
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
1
同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:
2(7)+2(3)+2(0)
1
进一步:7=22+2+20(21用2表示)
3=2+20
1
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
1
又如:
1315=210+28+25+2+1
1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
1
输入
一个正整数n(n≤20000)。
输出
一行,符合约定的n的0,2表示(在表示中不能有空格)。
样例输入
137
1
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
看到这个题首先觉得很简单啦,只要把数字的二进制表示出来即可,但是此时的我并没有意识到要怎么解决括号和加号的问题。想了很久条件依然不能正确输出,然后看了这个题主的答案,醒悟了哥们。
原链接:OpenJudge 004:2的幂次方表示_mesmerizing的博客-CSDN博客
把原数用二进制表示后,存入一个数组,倒着遍历这个数组,数组的下标即我们需要递归的指数。
(1)当数字为1,下标为1,即指数为1的情况下只需要输出2即可
(2)当数字为1,但下标不为1,则需要递归
(3)最后对于加号的输出,只要下标i前面有1,则需要输出加否则不用
代码如下
#include<iostream>
using namespace std;
int n;
void digui(int num) {
if (num == 0) {//结束递归
cout << 0;
return;
}
else {
int a[20] = {};
int cnt = 0;
while (num) {//二进制存储数据
a[cnt++] = num % 2;
num /= 2;
}
for (int i = cnt - 1; i >= 0; i--) {
int flag = 0;//需要判断+号前面有无输出,有输出才需要加号
if (a[i] && i == 1) {
cout << 2;
flag = 1;
}
if (a[i] && i != 1) {
cout << 2 << '(';
digui(i);//递归指数
cout << ')';
flag = 1;
}
if (flag) {
for (int k = 0; k < i; k++) {
if (a[k]) {//找i前1
cout << '+';
break;
}
}
}
}
}
}
int main()
{
cin >> n;
digui(n);
return 0;
}