洛谷1303 A*B Problem 解题报告

时间:2021-10-25 11:45:35

洛谷1303 A*B Problem

本题地址:http://www.luogu.org/problem/show?pid=1303

题目描述

求两数的积。

输入输出格式

输入格式:

两个数

输出格式:

输入输出样例

输入样例#1:

1
2

输出样例#1:

2

说明

需用高精

题解

高精度

像高精度加减法运算一样,模拟乘法竖式运算。我们依然采取先计算后进位的策略。

1.输入与存储同加法运算。

2.结果的最大位数是两个因数的位数之和。

3.按照乘法竖式运算进行计算与进位。

4.输出之前处理最高位的进位,最高位的进位可能不止一位。

下面附上代码。

代码

  1. var
  2. st1,st2:ansistring;
  3. i,j:longint;
  4. x,lena,lenb,lenc:qword;
  5. a,b,c:array[0..10000] of qword;
  6. begin
  7. {读入}
  8. readln(st1);
  9. readln(st2);
  10. {预处理}
  11. lena:=length(st1);
  12. lenb:=length(st2);
  13. for i:=1 to lena do a[lena-i+1]:=ord(st1[i])-48;
  14. for i:=1 to lenb do b[lenb-i+1]:=ord(st2[i])-48;
  15. {1循环{重置进位} 2循环{{当前乘积+上次进位+原数}{处理进位并取模}} {进位}}
  16. for i:=1 to lena do begin
  17. x:=0;
  18. for j:=1 to lenb do begin
  19. c[i+j-1]:=a[i]*b[j]+x+c[i+j-1];
  20. x:=c[i+j-1] div 10;
  21. c[i+j-1]:=c[i+j-1] mod 10;
  22. end;
  23. c[i+j]:=x;
  24. end;
  25. {确定位数并删零}
  26. lenc:=lena+lenb;
  27. while (c[lenc]=0)and(lenc>1) do dec(lenc);
  28. {输出}
  29. for i:=lenc downto 1 do write(c[i]);
  30. end.

(本文系笔者原创,未经允许不得转载)