POJ 1001

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

你可能感兴趣的:(poj)