游客 Signup | Login
中文 | En

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

高精度乘以低精度(lowmul/c/cpp) 

【问题描述】 

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

【输入格式】lowmul.in

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

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

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

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

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