例如:137=2^7+2^3+2^0,约定a^b可表示为a(b),则137可表示为:2(7)+2(3)+2(0),进一步7=2^2+2+2^0,3=2+2^0。所以137最终可以表示为2(2(2)+2+2(0))+2(2+2(0))+2(0)。
输入:正整数(n<=20 000).
输出:符合约定的n的0,2表示(在表示中不能有空格)。
算法设计:由于不知道数据的位数,加上对数据还是从低位到高位的操作比较简单,而输出显然是由高位到低位进行的,这是就要考虑用递归机制实现算法了。
//n为操作数,r为递归深度
void fun(int n, int r)
{
//递归结束
if (1 == n)
{
cout<<"2("<<r<<")";
}
else
{
//n除以二,递归深度加1
fun(n/2, r+1);
//如果模2有余数,则为2^r
if (1 == n%2)
{
cout<<"+2("<<r<<")";
}
}
}
经过上面的处理,如果输入fun(137,0),则输出为2(7)+2(3)+2(0)。
这时,如果对7和3递归处理,则为满足题意的输出。如下代码所示:
//n为操作数,r为递归深度
void fun(int n, int r)
{
//递归结束,最先输出,不带+号
if (1 == n)
{
/*cout<<"2("<<r<<")";*/
//将r表示成0和2
switch(r)
{
//2^0,递归深度为0
case 0:cout<<"2(0)";break;
//2^1,递归深度为1
case 1:cout<<"2";break;
//2^2,递归深度为2
case 2:cout<<"2(2)";break;
//2^r,递归深度为r
default:
cout<<"2(";
fun(r,0);
cout<<")";
}
}
else
{
//n除以二,递归深度加1
fun(n/2, r+1);
//如果模2有余数,则为2^r
if (1 == n%2)
{
/*cout<<"+2("<<r<<")";*/
/*cout<<"2("<<r<<")";*/
//将r表示成0和2
switch(r)
{
//2^0,递归深度为0
case 0:cout<<"+2(0)";break;
//2^1,递归深度为1
case 1:cout<<"+2";break;
//2^2,递归深度为2
case 2:cout<<"+2(2)";break;
//2^r,递归深度为r
default:
cout<<"+2(";
fun(r,0);
cout<<")";
}
}
}
}
经过上面的处理,如果输入fun(137,0),
则输出为2(2(2)+2+2(0))+2(2+2(0))+2(0)。