前几天跟Clavichord比赛……比的就是POJ 1001.虽然是水题吧,但是参加了几届NOIP之后高精度一点也不会写了……
晚自习第三节“比赛”开始,比谁先写出这个题。题目是给若干组实数a、b,求a^b……
我刚打开Lazarus,Clavichord猥琐地说他已经写了一半了……不公平啊,逼迫他删的只剩下头文件……得,我也耍赖……我关了Lazarus直接打开Eclipse……
解法①:直接上Java……
import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); BigDecimal a; BigDecimal ans; long b; while (scanner.hasNext()) { a=scanner.nextBigDecimal(); b=scanner.nextLong(); ans=a; for (int i=2;i<=b;i++) ans=ans.multiply(a); String str=new String(ans.toPlainString()); int len=str.length()-1; while (str.charAt(len)=='0') len--; if (str.charAt(len)=='.') len--; int p=0; while (str.charAt(p)=='0') p++; for (int i=p;i<=len;i++) System.out.print(str.charAt(i)); System.out.println(); } } }
“我强烈鄙视高精度写Java的……”
好吧好吧,我写Pascal行了吧……
{$M 10000000} program POJ_1001; var s,ans:ansistring; c:char; n,i:longint; function multiply(s,q:ansistring):ansistring; var a,b,c:array[1..110000]of integer; len,len1,len2,float,i,j:longint; ans:ansistring; begin fillchar(c,sizeof(c),0); multiply:=''; float:=(length(s)-pos('.',s))+(length(q)-pos('.',q)); delete(s,pos('.',s),1);delete(q,pos('.',q),1); ans:=''; for i:=1 to length(s) do a[length(s)-i+1]:=ord(s[i])-ord('0'); for i:=1 to length(q) do b[length(q)-i+1]:=ord(q[i])-ord('0'); len1:=length(s); len2:=length(q); for i:=1 to len1 do for j:=1 to len2 do begin c[i+j-1]:=c[i+j-1]+a[i]*b[j]; c[i+j]:=c[i+j]+c[i+j-1] div 10; c[i+j-1]:=c[i+j-1] mod 10; end; len:=len1+len2+1; while c[len]>0 do begin c[len+1]:=c[len] div 10; c[len]:=c[len] mod 10; inc(len); end; for i:=len downto 1 do ans:=ans+chr(c[i]+ord('0')); insert('.',ans,len-float+1); exit(ans); end; begin while not eof() do begin s:=''; read(c); while c<>' ' do begin s:=s+c; read(c); end; readln(n); ans:=s; for i:=2 to n do ans:=multiply(ans,s); while ans[length(ans)]='0' do delete(ans,length(ans),1); while ans[1]='0' do delete(ans,1,1); if ans[length(ans)]='.' then delete(ans,length(ans),1); writeln(ans); end; end.
最后还是悲剧地输了……输在忘了处理100.00的情况,我应该把小数点一起删掉的……