0
点赞
收藏
分享

微信扫一扫

(一)枚举 (二)递归 NOIP 2的幂次方


NOIP 2的幂次方

  • ​​题目​​
  • ​​AC代码​​
  • ​​解析​​
  • ​​递归顺序​​
  • ​​递归及for循环是控制哪个变量​​
  • ​​边界条件​​
  • ​​找变化的量​​
  • ​​分析变量的变化​​
  • ​​坑以及注意事项​​
  • ​​+号如何输出​​
  • ​​()如何输出​​
  • ​​新知识​​
  • ​​和2进制有关的题目使用位处理​​
  • ​​在递归函数前后进行符号的处理​​
  • ​​第一次处理,第二次不处理,需要bool型标志位​​

题目

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型标志位


举报

相关推荐

0 条评论