洛谷 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; int n,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<<")"; } } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。