洛谷 P1303 A*B Problem(高精度乘法) 題解
阿新 • • 發佈:2017-09-02
正文 題目 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 intx = 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(高精度乘法) 題解