洛谷 P1303 A*B Problem(高精度乘法) 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1303 A*B Problem(高精度乘法) 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接 :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的情况
以上是关于洛谷 P1303 A*B Problem(高精度乘法) 题解的主要内容,如果未能解决你的问题,请参考以下文章