洛谷P1010 幂次方

题目描述

任何一个正整数都可以用22的幂次方表示。例如

137=2^7+2^3+2^0137=27+23+20

同时约定方次用括号来表示,即a^bab 可表示为a(b)a(b)。

由此可知,137137可表示为:

2(7)+2(3)+2(0)2(7)+2(3)+2(0)

进一步:

7= 2^2+2+2^07=22+2+20(2^1用2表示),并且

3=2+2^03=2+20

所以最后137137可表示为:

2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

1315=2^{10} +2^8 +2^5 +2+11315=210+28+25+2+1

所以13151315最后可表示为:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入输出格式

输入格式:

 

一个正整数n(n≤20000)

 

输出格式:

 

符合约定的nn的0,20,2表示(在表示中不能有空格)

输入输出样例

输入样例#1: 
1315
输出样例#1: 
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

解题思路:
一道很水的题,直接看代码(带注释)

AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 void dfs(int k) {
 5     int y;
 6     y = log2(k);//找到比n小的2次方中最大的 
 7     if(y == 0) cout << "2(0)";//终止条件 
 8     if(y == 1) cout << "2";//终止条件 
 9     if(y > 1) {//如果没有到边界,继续递归下去 
10         cout << "2(";
11         dfs(y);
12         cout << ")";
13     }
14     if(k != pow(2,y)) {//当n不等于2的y次方时
15         cout << "+";
16         dfs(k - pow(2,y));
17     }
18 }
19 int main()
20 {
21     cin >> n;
22     dfs(n);
23 
24 return 0;
25 }
 
   
  




猜你喜欢

转载自www.cnblogs.com/lipeiyi520/p/10355605.html