upd on $2018.10.2$
你们评论区的想干什么?放过我吧,一年前写的 pascal ,就当做是一个 p 党福利吧 qwq
~~这道题看起来恶心,其实很简单。~~
就是把一个数$n$转换成 $2^a+2^b+2^c+...$的形式。
自然就会想到二进制了。
先用一个函数,把一个数转成二进制,存在一个数组里面:
类似于:$10=2^3+2^1$
这个数组就是$[3,1]$
$137=2^7+2^3+2^0$
数组即为$[7,3,0]$//也就是这个数等于$2^a[1]+2^a[2]+2^a[3]...$
```
type num=array[0..100000] of longint;
var i,j,k,l,n,m,o,p,h:longint;
//这里的a[0]指数组长度。
function ejz(s:longint):num;//要转的数
var i,j,k:longint;
ans:num;
begin
i:=s; j:=0; k:=0; //让变量i赋值为要转的数s
fillchar(ejz,sizeof(ejz),0);
fillchar(ans,sizeof(ans),0);
while i>0 do
begin
inc(j);
ejz[j]:=i mod 2;
i:=i div 2; //转2进制的过程在此。
end;
for i:=j downto 1 do
if ejz[i]=1 then begin inc(k); ans[k]:=i-1; end;//若2进制的第n位为1,那么数组中必有n-1。这个应该知道吧
ans[0]:=k;
exit(ans);
end;
```
然后是处理。
显然,数组中的数还需要继续处理下去。
譬如:$137=2^7+2^3+2^0$
那么$137=2(7)+2(3)+2(0)$
然后处理$7 \ 3\ 0$
$7=2^2+2^1+2^0 $
那么$7=2(2)+2+2(0)$
递归下去,然后以此类推即可
```pascal
procedure search(a:longint);
var n:num; i:longint;
begin
if a=0 then begin write('2(0)'); exit; end; //如果要处理0,那么...
if a=1 then begin write('2'); exit; end; //如果要处理1,那么...
n:=ejz(a);
for i:=1 to n[0]-1 do
begin
if (n[i]<>1) and (n[i]<>0) then write('2(');//这里要注意了!2^1不是2(1)!!!
search(n[i]);//递归处理数组里的数
if (n[i]<>1) and (n[i]<>0) then write(')');
write('+');//不要把加号输多了!
end;
if (n[n[0]]<>1) and (n[n[0]]<>0) then write('2(');
search(n[n[0]]);
if (n[n[0]]<>1) and (n[n[0]]<>0) then write(')');
end;
begin
readln(n);
search(n);
end.
```