洛谷 P1303 A*B Problem(高精度乘法) 题解

时间:2021-08-20 00:20:55

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接 :https://www.luogu.org/problem/show?pid=1303

题目描述

求两数的积。

输入输出格式

输入格式:

两行,两个数。

输出格式:

输入输出样例

输入样例#1:
1 
2
输出样例#1:
2

说明

每个数字不超过10^2000,需用高精

 

AC代码:

 1 #include<cstdio>
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5
6 using namespace std;
7 const int MAXN = 10000 + 5;
8
9 struct bign
10 {
11 int len;
12 bool flag;
13 int num[MAXN];
14
15 bign(){len = 0;flag = false;memset(num,0,sizeof(num));}
16
17 void clear()
18 {
19 len = 0;
20 flag = false;
21 memset(num,0,sizeof(num));
22 }
23 };
24 bign ans;
25
26 inline bool judge(bign a)
27 {
28 if(a.len == 1 && a.num[1] == 0)
29 return true;
30 return false;
31 }
32
33 bign operator *(bign &a,bign &b)
34 {
35 int x = 0;
36 ans.clear();
37 int len = a.len + b.len + 1;
38 for(int i = 1;i <= a.len;++ i)
39 {
40 for(int j = 1;j <= b.len;++ j)
41 {
42 ans.num[i+j-1] += a.num[i]*b.num[j]+x;
43 x = ans.num[i+j-1]/10;
44 ans.num[i+j-1] %= 10;
45 }
46 ans.num[i+b.len] += x;x = 0;
47 }
48 while(!ans.num[len]) len --;
49 ans.len = len;
50 return ans;
51 }
52
53 inline bign get()
54 {
55 ans.clear();
56 string s;
57 cin>>s;
58 int len = s.length();
59 for(int i = 0;i < len;++ i)
60 ans.num[len-i] = s[i]-'0';
61 ans.len = len;
62 return ans;
63 }
64
65 inline void print(bign a)
66 {
67 int len = a.len;
68 for(int i = len;i >= 1;-- i)
69 printf("%d",a.num[i]);
70 puts("");
71 }
72
73 int main()
74 {
75 bign a,b;
76 a = get();
77 b = get();
78 if(judge(a) || judge(b))
79 printf("0\n");
80 else
81
82 print(a*b);
83 return 0;
84 }

注意要特判a或b为0的情况