【洛谷】P1010 幂次方(分治+递归)

题目链接

题目描述

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

137=2^7+2^3+2^0

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

由此可知, 137 可表示为:

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

进一步:

7= 2^2+2+2^0(2^1用2表示),并且

3=2+2^0

所以最后 137可表示为:

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

又如:

1315=2^10 +2^8 +2^5 +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 表示(在表示中不能有空格)

输入输出样例

输入样例#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<iostream>
 2 #include<sstream>
 3 #include<algorithm>
 4 #include<string>
 5 #include<iomanip>
 6 #include<vector>
 7 #include<cmath>
 8 #include<stack>
 9 using namespace std;
10 void fun(int i)//将i分解
11 {
12     if(i==0) 
13     {
14         cout<<"0";return;
15     }
16     else if(i==1) 
17     {
18         cout<<"2(0)";return;
19     }
20     else if(i==2) 
21     {
22         cout<<"2";return;
23     }
24     else 
25     {
26         int t=0;
27         while((1<<t)<=i) t++;
28         t-=1;
29         if(t!=1)
30         {
31             cout<<"2(";
32                 fun(t);
33                 cout<<")";
34         }
35         else cout<<"2";
36             int res=i-(1<<t);
37             if(res!=0) 
38         {
39             cout<<"+";fun(res);
40         }
41     }
42 }
43 int main()
44 {
45     int n;
46     cin>>n;
47     fun(n);
48 }
49  
View Code
原文地址:https://www.cnblogs.com/wangzhebufangqi/p/12796169.html