1. 程式人生 > >洛谷 P1010 冪次方

洛谷 P1010 冪次方

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;
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<<")"; } } }

 

洛谷 P1010 冪次方