1. 程式人生 > >高精度計算-大整數乘法

高精度計算-大整數乘法

大整數乘法

問題描述

求兩個不超過 200 位的非負整數的積。
輸入資料
有兩行,每行是一個不超過 200 位的非負整數,沒有多餘的前導 0。
輸出要求
一行,即相乘後的結果。結果裡不能有多餘的前導 0,即如果結果是 342,那麼就不能
輸出為 0342。

輸入樣例
12345678900
98765432100
輸出樣例
1219326311126352690000

解題思路

乘法規律,一個數的第i位和另一個數的第j位相乘,一定會累加到結果的第i+j位,結果的陣列一個數組元素存2位數,最後對結果處理進位,最後打印出來

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <stdbool.h> #define MAX_LEN 200 int x[MAX_LEN + 20], y[MAX_LEN + 20], z[MAX_LEN * 2 + 20]; char a[MAX_LEN + 20], b[MAX_LEN + 20]; void char_to_int(const char s[ ], int x[ ]) { int i = 0; int len = strlen(s); memset(x, 0, MAX_LEN + 20); int j = 0; for
(i = len - 1; i >= 0; i--) { x[j++] = s[i] - '0'; } } void big_int_mul(const int x[], const int y[], int z[]) { int i , j = 0; memset(z, 0, MAX_LEN * 2 + 20); for (i = 0; i < MAX_LEN; i++) { for (j = 0; j < MAX_LEN; j ++) { z[i + j] += x[i] * y[j]; } } for
(i = 0; i < MAX_LEN * 2; i ++) { if (z[i] >= 10) { z[i+1] += z[i] /10; z[i] %= 10; } } } void big_int_print(const int z[]) { bool flag = 0; int i = 0; for (i = MAX_LEN; i >= 0; i--) { if (flag) printf("%d", z[i]); else if (z[i]) { printf("%d", z[i]); flag = 1; } } if (!flag) printf("0"); printf("\n"); } int main( ) { scanf("%s", a); scanf("%s", b); char_to_int(a, x); char_to_int(b, y); big_int_mul(x, y, z); big_int_print(z); return 0; }