洛谷 P1010 冪次方
阿新 • • 發佈:2017-11-27
round tdi string 約定 mes span left scanf algorithm
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)
思路:搜索。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; intn,tot; int num[100]; void dfs(int x){ int sum=0,tmp[1000]={0}; while(x){ tmp[sum++]=x%2;x/=2; } for(int i=sum-1;i>=0;i--) if(tmp[i]){ if(i==0) cout<<"2(0)"; else if(i==1) cout<<"2"; else{ cout<<"2(";dfs(i);cout<<")"; } tmp[i]=0; break; } for(int i=tot-1;i>=0;i--) if(tmp[i]){ if(i==0) cout<<"+2(0)"; else if(i==1) cout<<"+2"; else{ cout<<"+2(";dfs(i);cout<<")"; } } } int main(){ scanf("%d",&n); while(n){ num[tot++]=n%2;n/=2; } for(int i=tot-1;i>=0;i--) if(num[i]){ if(i==0) cout<<"2(0)"; else if(i==1) cout<<"2"; else{ cout<<"2(";dfs(i);cout<<")"; } num[i]=0; break; } for(int i=tot-1;i>=0;i--) if(num[i]){ if(i==0) cout<<"+2(0)"; else if(i==1) cout<<"+2"; else{ cout<<"+2(";dfs(i);cout<<")"; } } }
洛谷 P1010 冪次方