【2016.10.7NOIP普及模拟】幂运算

lzusa 发布于 2019-04-14 2 次阅读


题目描述

星期五下午,放学的下课铃声响了,周末到了,同学们非常高兴。但今天小Y高兴不起来,因为老师布置了一道比较烦的幂运算题。
一般情况下,计算机所能够处理的小数的范围和精度都是非常有限的。小Y的老师给出了一个小数a和指数b,让小Y求ab。小Y觉得手算非常麻烦,于是很不高兴,希望你能编程帮助他计算。

输入

输入文件exp.in仅包含两行。
第一行是a。
第二行是b。
a>0,a的长度不超过10位(不包括小数点),保证这个数是X.Y的形式,其中X一定存在,但Y可能没有(此时小数点也不会有)。a可能有多余的前导零或尾零。
1 <= b <= 25,且为整数。

输出

输出文件exp.out仅包含一行,即ab的结果。
整数部分前面有0必须去掉,小数部分末尾有0也必须去掉。例如000.10100需要变为.101(整数部分为0也去掉)。如果结果是整数则直接输出整数形式即可。

思路

普通的高精度乘法

const maxn=1000;
var
  a:array[1..maxn] of int64;
  i,j,k,n,m,l,p:longint;
  st:string;

procedure init;
begin
  readln(st);
  readln(m);
  l:=length(st);
  while st[l]='0' do
    dec(l);
  delete(st,l+1,length(st)-l);
  for i:=1 to l do
    if st[i]='.'
      then begin
             p:=l-i;
             dec(l);
             delete(st,i,1);
             break
           end;
  j:=1;
  while (st[j]='0') and (j<i-1) do
    begin
      dec(l);
      inc(j)
    end;
  delete(st,1,length(st)-l);
  for i:=l downto 1 do
    a[maxn-l+i]:=ord(st[i])-ord('0');
  val(st,n);
end;

procedure mul;
var
  i:longint;
  s,g:int64;
begin
  g:=0;
  for i:=maxn downto 1 do
    begin
      s:=a[i]*n+g;
      a[i]:=s mod 10;
      g:=s div 10
    end;
end;

procedure print;
begin
  i:=1;
  p:=p*m;
  while (a[i]=0) and (i<maxn-p+1) do
    inc(i);
  k:=maxn;
  while a[k]=0 do
    dec(k);
  for j:=i to k do
    if j=maxn-p+1
      then write('.',a[j])
      else write(a[j])
end;
begin
    assign(input,'exp.in');
  reset(input);
  assign(output,'exp.out');
  rewrite(output);
  init;
  for i:=1 to m-1 do
    mul;
  print;
end.