题解 P1010 【幂次方】

Fading

2017-10-26 17:51:42

Solution

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. ```