1. 程式人生 > >(C語言)高精度乘法

(C語言)高精度乘法

題目描述

這道題很簡單,只需要計算a*b即可,唯一有點麻煩的就是a和b的長度可能有點長,什麼int啊,long long啊,double啊都可能從不下,怎麼辦?啟明星軟體組組長給了我一堆資料讓我幫他計算結果,你們誰來幫幫我。。。

輸入

輸入有多組資料。

對於每組測試資料,在一行中給出兩個整數a,b(a,b的位數小於等於1000),中間用一個空格隔開。

保證輸入沒有前導0;


當讀到檔案結尾時輸入結束

輸出

對於每組輸入,在一行中輸出兩個整數相乘的結果(注意輸出格式控制)。

樣例輸入

123456 789
123456789 123456
123456 123456789
1234567891234567891234567984489413 3254698745621556461151

樣例輸出

97406784
15241481342784
15241481342784
4018146566985798265744855610651282705766247201905294363

個人認為這個考慮的情況比較多,首先應判斷兩個數有沒有為零,然後判斷兩個數之前有沒有負號,如果有負號,則不考慮負號將字串倒置轉換成數字型別放入一個數組中,然後將兩個陣列的每一位對應相乘,進位與之前的高精度加法一樣,最後輸出的時候的將陣列前面的零去掉然後帶上符號輸出結果即可

#include<stdio.h>

#include<string.h>
int main() {
char n[1000],m[1000];
int a[1000],b[1000];
while (scanf("%s%s",n,m) != EOF) {
int n1,m1;
int i,j;
int k1,k2;
int c[2000] = {0};
n1 = strlen (n);
m1 = strlen (m);
if ((n1 == 1 && n[0] == '0') || (m1 == 1 && m[0] == '0')) {
printf("0\n");

else {
if (n[0] == '-') {
k1 = -1;
for (i = 0,j = n1-1; i < n1-1; i++,j--)
a[i] = n[j]-'0';
n1--;
}
else {
k1 = 1;
for (i = 0,j = n1-1; i < n1; i++,j--)
a[i] = n[j]-'0';
}
if (m[0] == '-') {
k2 = -1;
for (i = 0,j = m1-1; i < m1-1; i++,j--)
b[i] = m[j]-'0';
m1--;
}
else {
k2 = 1;
for (i = 0,j = m1-1; i < m1; i++,j--)
b[i] = m[j]-'0';
}
for (i = 0; i < n1; i++)
for (j = 0; j< m1;j++)
c[i+j] += a[i]*b[j];
for (i = 0; i< n1+m1; i++) {
if (c[i] >= 10) {
c[i+1] += c[i]/10;
c[i] %= 10;
}
}
j = 1999;
while (!c[j])
j--;
if (k1*k2 == -1)
printf("-");
for (i = j; i >= 0; i--)
printf("%d",c[i]);
printf("\n");
}

return 0;
}