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

原文地址:https://www.cnblogs.com/Delostik/p/1972248.html