2134 - [数值问题]高精度乘以高精度
【问题描述】
输入两个高精度正整数a和b(a,b位数<=200),求两数的乘积。
【输入格式】highmul.in
<span>输入共两行,分别为a和b。</span>
<span>【输出格式】highmul.out</span>
<span>输出共一行,表示两个数的积。</span>
<span>【输入样例1】 </span><span><br />
1234567890
1234567890
<br />
<br />
<span style="line-height:21px;"></span>
<span>【输出样例1】</span>
1524157875019052100
<br />
<br />
Input
Output
Examples
Input
Output
Hint
Const
SIZE = 400;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of integer;
End;
var a,b:hugeint;
s1,s2:string;
i:integer;
procedure times(a, b : hugeint);
Var
i, j : Integer;
ans : hugeint;
Begin
FillChar(ans, SizeOf(ans), 0);
For i := 1 To a.len Do
For j := 1 To b.len Do
ans.num[i + j - 1] := ans.num[i + j - 1] + a.num[i] * b.num[j];
For i := 1 To a.len + b.len Do
Begin
ans.num[i + 1] := ans.num[i + 1] + ans.num[i] DIV 10;
ans.num[i] := ans.num[i] mod 10;
If ans.num[a.len + b.len] > 0
Then ans.len := a.len + b.len
Else ans.len := a.len + b.len - 1;
End;
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
End;
procedure datain;
begin
assign(input,'highmul.in'); assign(output,'highmul.out');
reset(input); rewrite(output);
readln(s1);
readln(s2);
a.len:=length(s1);
b.len:=length(s2);
for i:=1 to a.len do a.num[i]:=ord(s1[a.len-i+1])-ord('0');
for i:=1 to b.len do b.num[i]:=ord(s2[b.len-i+1])-ord('0');
end;
begin
datain;
times(a,b);
close(input);
close(output);
end.<br />
Solution C++
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; int a1[202],b1[202],c[408]; char a[202],b[202]; int main() { gets(a); gets(b); a1[0]=strlen(a); b1[0]=strlen(b); for(int i=1;i<=a1[0];++i) a1[i]=a[a1[0]-i]-48; for(int i=1;i<=b1[0];++i) b1[i]=b[b1[0]-i]-48; for(int i=1;i<=a1[0];++i) { int x=0; for(int j=1;j<=b1[0];++j) { c[i+j-1]=a1[i]*b1[j]+x+c[i+j-1]; x=c[i+j-1]/10; c[i+j-1]=c[i+j-1]%10; } c[i+b1[0]]=x; } int lenc=a1[0]+b1[0]; while(c[lenc]==0&&lenc>1)--lenc; for(int i=lenc;i>=1;--i) printf("%d",c[i]); system("pause"); return 0; }
Hint
Const
SIZE = 400;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of integer;
End;
var a,b:hugeint;
s1,s2:string;
i:integer;
procedure times(a, b : hugeint);
Var
i, j : Integer;
ans : hugeint;
Begin
FillChar(ans, SizeOf(ans), 0);
For i := 1 To a.len Do
For j := 1 To b.len Do
ans.num[i + j - 1] := ans.num[i + j - 1] + a.num[i] * b.num[j];
For i := 1 To a.len + b.len Do
Begin
ans.num[i + 1] := ans.num[i + 1] + ans.num[i] DIV 10;
ans.num[i] := ans.num[i] mod 10;
If ans.num[a.len + b.len] > 0
Then ans.len := a.len + b.len
Else ans.len := a.len + b.len - 1;
End;
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
End;
procedure datain;
begin
assign(input,'highmul.in'); assign(output,'highmul.out');
reset(input); rewrite(output);
readln(s1);
readln(s2);
a.len:=length(s1);
b.len:=length(s2);
for i:=1 to a.len do a.num[i]:=ord(s1[a.len-i+1])-ord('0');
for i:=1 to b.len do b.num[i]:=ord(s2[b.len-i+1])-ord('0');
end;
begin
datain;
times(a,b);
close(input);
close(output);
end.
<br />