【2016.10.7NOIP普及模拟】幂运算

来源:互联网 发布:手机淘宝描述尺寸 编辑:程序博客网 时间:2024/05/20 15:58

题目描述

星期五下午,放学的下课铃声响了,周末到了,同学们非常高兴。但今天小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.
0 0
原创粉丝点击