NOIP 2的幂次方
题目
002:2的幂次方表示
查看提交统计提问
总时间限制: 1000ms 内存限制: 65536kB
描述
任何一个正整数都可以用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(n≤20000)。
输出
一行,符合约定的n的0,2表示(在表示中不能有空格)。
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
AC代码
/**********************************************************************/
/* _ _ __ __ ____ _____ */
/* | | | | | \/ | / ___| | ___| */
/* | | | | | |\/| | | | | |___ */
/* | |_| | | | | | | |___ | |___| */
/* \___/ |_| |_| \____| |_| */
/**********************************************************************/
# include<iostream>
using namespace std;
inline int GetBit(int n,int i)
{
return (n >> i ) & 1;
}
void twoPower(int n)
{
bool first = true;
for(int i=15 ; i>=0;i--)
{
if(GetBit(n,i))
{
if(!first)
{
cout << "+";
}
else
{
first = false;
}
if(i == 1)
{
cout << "2";
}
else if(i == 0)
{
cout << "2(0)";
}
else
{
cout << "2(";
twoPower(i);
cout << ")";
}
}
}
}
int main()
{
int n =0 ;
cin >> n;
twoPower(n);
}
解析
参看中国大学慕课郭炜老师课程讲解递归二
一个整数,可以用二进制表示,比如137(D)=1000 1001(B)
很明显137 = 27+23+2(因为该数字用二进制表示,第0,3,7)位是1
递归顺序
从小到大还是从大到小,根据输出的要求决定。这道题,从左到右输出,显然是从大到小,从高位开始遍历输出
递归及for循环是控制哪个变量
对于一个表达式,递归函数twopower()是将参数n分解为2的幂,
for循环对该数值二进制的每一位进行变遍历,以及对应处理,是处理这个最终输出的表达式的项,所以"+"在for循环里处理
边界条件
分为两步
找变化的量
n以及i
分析变量的变化
主要是i,i到0,1时需要输出,不能进行函数递归
坑以及注意事项
+号如何输出
一个表达式,第一个项前面不需要加号,之后的项前面都需要。所以需要一个first标志位,第一次遇到某一位为1,则改变标志但不加“+”,之后加“”+“”
()如何输出
在递归的前后需要括号