(一)枚举 (二)递归 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,则改变标志但不加“+”,之后加“”+“”

()如何输出

在递归的前后需要括号

新知识

和2进制有关的题目使用位处理

在递归函数前后进行符号的处理

第一次处理,第二次不处理,需要bool型标志位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值