2133 - [数值问题]高精度乘以低精度
【问题描述】
输入两个高精度正整数a和b(a位数<=200,b的位数<=9位),求两数的乘积。
【输入格式】lowmul.in
<span>输入共两行,分别为a和b。</span>
<span>【输出格式】lowmul.out</span>
<span>输出共一行,表示两个数的积。</span>
<span>【输入样例1】 </span><span><br />
9999999999999999999999999999999999
<span style="line-height:21px;">1111111</span>
<span>【输出样例1】</span>
99999999899999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999000000001
Input
Output
Examples
Input
Output
Hint
Const
SIZE = 200+10;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of int64;
End;
var a:hugeint;
s1:string;
i:integer;
x:longint;
procedure lowmul(a:hugeint;x:longint);
var
i:longint;
ans:hugeint;
begin
fillchar(ans.num,sizeof(ans.num),0);
ans.len:=a.len;
for i:=1 to ans.len do ans.num[i]:=a.num[i]*x;
for i:=1 to ans.len do
begin
inc(ans.num[i+1],ans.num[i] div 10);
ans.num[i]:=ans.num[i] mod 10;
end;
while ans.num[ans.len+1]>0 do
begin
inc(ans.len);
inc(ans.num[ans.len+1],ans.num[ans.len] div 10);
ans.num[ans.len]:=ans.num[ans.len] mod 10;
end;
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
end;
procedure datain;
begin
assign(input,'lowmul.in'); assign(output,'lowmul.out');
reset(input); rewrite(output);
readln(s1);
readln(x);
a.len:=length(s1);
for i:=1 to a.len do a.num[i]:=ord(s1[a.len-i+1])-ord('0');
end;
begin
datain;
lowmul(a,x);
close(input);close(output);
end.<br />
Solution C++
#include<cstdio> #include<cstdlib> #include<cstring> int main() { char a1[30],b1[30]; int a[30]={0},b[30]={0},c[30]={0},g=0, d=0,e=0,f=0,k=0,i,j; gets(a1);d=strlen(a1); gets(b1);e=strlen(b1); for(i=0;i<d;i++) a[d-i-1]=a1[i]-48; for(i=0;i<e;i++) b[e-i-1]=b1[i]-48; for(j=0;j<e;j++) { for(i=0;i<d;i++) { c[i+j]=c[i+j]+a[i]*b[j]+k; k=c[i+j]/10; c[i+j]=c[i+j]%10; } if(k) { c[i+j]=k; k=0; } } if(c[e+d-1]) printf("%d",c[e+d-1]); for(i=e+d-2;i>=0;i--) printf("%d",c[i]); system("pause"); return 0; }
Hint
Const
SIZE = 200+10;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of int64;
End;
var a:hugeint;
s1:string;
i:integer;
x:longint;
procedure lowmul(a:hugeint;x:longint);
var
i:longint;
ans:hugeint;
begin
fillchar(ans.num,sizeof(ans.num),0);
ans.len:=a.len;
for i:=1 to ans.len do ans.num[i]:=a.num[i]*x;
for i:=1 to ans.len do
begin
inc(ans.num[i+1],ans.num[i] div 10);
ans.num[i]:=ans.num[i] mod 10;
end;
while ans.num[ans.len+1]>0 do
begin
inc(ans.len);
inc(ans.num[ans.len+1],ans.num[ans.len] div 10);
ans.num[ans.len]:=ans.num[ans.len] mod 10;
end;
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
end;
procedure datain;
begin
assign(input,'lowmul.in'); assign(output,'lowmul.out');
reset(input); rewrite(output);
readln(s1);
readln(x);
a.len:=length(s1);
for i:=1 to a.len do a.num[i]:=ord(s1[a.len-i+1])-ord('0');
end;
begin
datain;
lowmul(a,x);
close(input);close(output);
end.
<br />