前几天跟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的情况,我应该把小数点一起删掉的……