1. 程式人生 > >洛谷 P1303 A*B Problem(高精度乘法) 題解

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

正文 題目 names printf 精度 bool return max org

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接 :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(高精度乘法) 題解