小数高精度乘法
program P1001;
Type
arr=record
a:array[1..10000] of longint;
len:longint;
xs:longint;
end;
Var
s:ansistring;
n,i,j,k,len:longint;
r:arr;
Procedure relax(var c:arr);
var
i,j:longint;
begin
while (c.a[c.len]=0) and (c.len>1) do dec(c.len);
if (c.len=1) and (c.a[1]=0) then begin c.xs:=0; exit; end;
i:=1;
while (c.a[i]=0) do inc(i);
dec(i);
if (i>0) then
begin
if (c.xs>=i) then dec(c.xs,i)
else
begin
i:=c.xs;
c.xs:=0;
end;
for j:=i+1 to c.len do c.a[j-i]:=c.a[j];
dec(c.len,i);
end;
end;
procedure prin(c:arr);
var
i:longint;
begin
relax(c);
if (c.xs=0) then
begin
for i:=c.len downto 1 do write(c.a[i]);
writeln;
exit;
end;
if (c.xs<=c.len) then
begin
for i:=c.len downto c.xs+1 do write(c.a[i]);
write('.');
for i:=c.xs downto 1 do write(c.a[i]);
writeln;
exit;
end;
write('.');
for i:=1 to c.xs-c.len do write('0');
for i:=c.len downto 1 do write(c.a[i]);
writeln;
end;
Procedure cheng(a:arr;b:arr;var c:arr);
var
i,j:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to a.len do
for j:=1 to b.len do
begin
inc(c.a[i+j-1],a.a[i]*b.a[j]);
inc(c.a[i+j],c.a[i+j-1] div 10);
c.a[i+j-1]:=c.a[i+j-1] mod 10;
end;
c.len:=a.len+b.len+1;
c.xs:=a.xs+b.xs;
relax(c);
end;
procedure jie(a:arr;b:longint;var c:arr);
begin
if (b=1) then c:=a
else if (b mod 2=0) then
begin
jie(a,b div 2,c);
cheng(c,c,c);
end
else begin
jie(a,b div 2,c);
cheng(c,c,c);
cheng(c,a,c);
end;
end;
Begin
while (not(eof)) do
begin
readln(s);
len:=length(s);
i:=pos(' ',s);
j:=pos('.',s);
if j=0 then
begin
r.xs:=0;
r.len:=i-1;
for k:=1 to r.len do r.a[r.len-k+1]:=ord(s[k])-48;
end
else begin
r.xs:=i-j-1;
r.len:=i-2;
for k:=1 to j-1 do r.a[r.len-k+1]:=ord(s[k])-48;
for k:=j+1 to i-1 do r.a[r.len-k+2]:=ord(s[k])-48;
end;
relax(r);
i:=len;
while (s[i]<>' ') do dec(i);
n:=0;
for k:=i+1 to len do n:=n*10+ord(s[k])-48;
jie(r,n,r);
prin(r);
end;
end.