版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/83347752
Description
任何一个正整数都可以用2的幂次方表示。例如:137=27+23+20。同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:2(7)+2(3)+2(0),进一步:7= 2(2)+2+2(0),(21用2表示)3=2+2(0) ,所以最后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)
Input
正整数n(n≤20000)
Output
符合约定的n的0,2表示(在表示中不能有空格)
Sample Input
1315
Sample Output
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
直接递归.
#include <iostream>
#include <cmath>
using namespace std;
void doit(int x)
{
int k = -1, i, temp;
bool flag = false;
if (x == 2) // 两个边界条件
{
printf("2");
return;
}
if (x == 1)
{
printf("2(0)");
return;
}
temp = x;
while (temp)
{
++k;
temp >>= 1;
}
temp = pow(2, k);
for (i = k; ~i; --i)
{
if (!i) // 特判
{
temp = 1;
}
if (x & temp) // 巧妙运用&运算符
{
if (flag)
{
printf("+");
}
flag = true;
if (i == 1)
{
printf("2");
continue;
}
printf("2(");
if (i)
{
doit(i); // 递归
}
else
{
printf("0");
}
printf(")");
}
temp >>= 1;
}
return;
}
int main(void)
{
int x;
scanf("%d", &x);
doit(x);
return 0;
}