高精度乘法就是把 a 的每一位和 b 相乘。
关键的一件事就是别把积 c 数组 的每一位弄错了,比如用 a 的第 i 位 a[i] 乘以 b[j] ,那么对应的 c 的位数就是 c[i + j] (i,j都是从0开始),列一个竖式就能很直观地看出来了。
还有一件事就是 c 数组的位数问题,一个 n 位数的数乘以一个 m 位数的数,的数最多是一个 n + m 位数的数,所以 c 数组要开 2 * maxn
上代码
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 const int maxn = 1e3 +5; 7 char a1[maxn], b1[maxn]; 8 int a[maxn], b[maxn], c[2 * maxn]; //c的最高位最大为 la + lb,所以 maxn * 2 9 int main() 10 { 11 gets(a1); gets(b1); 12 int la = strlen(a1), lb = strlen(b1); 13 for(int i = 0; i < la; ++i) a[i] = a1[la - i - 1] - '0'; 14 for(int i = 0; i < lb; ++i) b[i] = b1[lb - i - 1] - '0'; //读入 15 for(int i = 0; i < la; ++i) //用b乘以a的每一位 16 { 17 for(int j = 0; j < lb; ++j) 18 { 19 c[i + j] += a[i] * b[j]; 20 c[i + j + 1] += c[i + j] / 10; //给下一位进位 21 c[i + j] %= 10; 22 } 23 } 24 int lc = la + lb; 25 while(c[lc] == 0 && lc > 0) lc--; //删除前导零 26 for(int i = lc; i >= 0; --i) printf("%d", c[i]); 27 printf("\n"); 28 return 0; 29 }
还有一个比较丑的带负数的代码
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cctype> 8 #include<vector> 9 #include<stack> 10 #include<queue> 11 using namespace std; 12 #define enter puts("") 13 #define space putchar(' ') 14 #define Mem(a, x) memset(a, x, sizeof(a)) 15 #define rg register 16 typedef long long ll; 17 typedef double db; 18 const int INF = 0x3f3f3f3f; 19 const db eps = 1e-8; 20 const int maxn = 505; 21 inline ll read() 22 { 23 ll ans = 0; 24 char ch = getchar(), last = ' '; 25 while(!isdigit(ch)) last = ch, ch = getchar(); 26 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); 27 if(last == '-') ans = -ans; 28 return ans; 29 } 30 inline void write(ll x) 31 { 32 if(x < 0) x = -x, putchar('-'); 33 if(x >= 10) write(x / 10); 34 putchar(x % 10 + '0'); 35 } 36 37 char a1[maxn], b1[maxn]; 38 int a[maxn], b[maxn], c[maxn << 1]; 39 int flg1 = 0, flg2 = 0; 40 41 int main() 42 { 43 scanf("%s%s", a1, b1); 44 int la = strlen(a1), lb = strlen(b1); 45 if(a1[0] == '-') 46 { 47 flg1 = 1; 48 for(int i = 1; i < la; ++i) a1[i - 1] = a1[i]; 49 la--; 50 } 51 if(b1[0] == '-') 52 { 53 flg2 = 1; 54 for(int i = 1; i < lb; ++i) b1[i - 1] = b1[i]; 55 lb--; 56 } 57 for(int i = 0; i < la; ++i) a[i + 1] = a1[la - i - 1] - '0'; 58 for(int i = 0; i < lb; ++i) b[i + 1] = b1[lb - i - 1] - '0'; 59 for(int i = 1; i <= la; ++i) 60 for(int j = 1; j <= lb; ++j) 61 { 62 c[i + j] += a[i] * b[j]; 63 c[i + j + 1] += c[i + j] / 10; 64 c[i + j] %= 10; 65 } 66 int x = la + lb + 5; 67 while(!c[x] && x > 2) x--; 68 bool flg3 = 1; 69 if(!c[x] && x == 2) flg3 = 0; 70 if(flg1 ^ flg2 && flg3) putchar('-'); 71 for(int i = x; i > 1; --i) write(c[i]); enter; 72 return 0; 73 }