游客 Signup | Login
中文 | En

2134 - [数值问题]高精度乘以高精度

高精度乘以高精度(highmul/c/cpp) 

【问题描述】 

输入两个高精度正整数a和b(a,b位数<=200),求两数的乘积。

【输入格式】highmul.in

<span>输入共两行,分别为a和b。</span> 

<span>【输出格式】highmul.out</span> 

<span>输出共一行,表示两个数的积。</span> 

<span>【输入样例1】&nbsp;</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 />

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题