题目描述
星期五下午,放学的下课铃声响了,周末到了,同学们非常高兴。但今天小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.
Comments NOTHING