【noip1998】题解:2的幂次方
思路:设递归函数dfs(x)用于输出x的幂次方
最容易的思路:0不输出,1输出为2(0),2输出2,剩下的递归执行。
每一次递归:例如7,拆分为4+3,先拆出最大的是2的次方的数出来,输出4,再把3分拆输出。
对于3,拆分为2+1。
代码:
1 //flag用于标记输出时前面是否需要加+号 2 #include<bits/stdc++.h> 3 using namespace std; 4 int n; 5 void dfs(int n,bool flag){ 6 if(n==0)return; 7 if(flag)cout<<"+"; 8 if(n==2)cout<<"2"; 9 else if(n==1)cout<<"2(0)"; 10 //else if(n==0)return; 11 else{ 12 int i; 13 for(i=0;;i++){ 14 if(pow(2,i)>n)break; 15 } 16 i--; 17 if(i==1)cout<<"2"; 18 else{ 19 cout<<"2("; 20 dfs(i,0); 21 cout<<")"; 22 } 23 dfs(n-pow(2,i),1); 24 } 25 } 26 int main(){ 27 cin>>n; 28 dfs(n,0); 29 }