大數的乘法【陣列】
阿新 • • 發佈:2018-12-23
題目描述
大數是指計算的數值非常大或者對運算的精度要求非常高,用已知的資料型別無法精確表示的數值。例如:我們要計算如下兩個數的乘積時,用我們已知的資料型別是無法精確表示其結果的:
a1 = 11111111111111111111111111111111111
b1 = 11111111111111111111111111111111111111
求:a1 * b1;
輸入
輸入兩行:每行一個數字,每行的數字不超過100位(不會出現負數,可能會有多餘的0);
輸出
輸出一行:為這兩個大數的乘積的最簡形式
樣例輸入
1111111111111111111
111111111111111
分析:
本題是大數的四大基本操作。在本題中我們可以採用,先全部累加,不進位,最後在統一進位。然後本題需要考慮一下如果,其中有一個數為0的話是要特殊處理的。
#include"stdio.h" #include"string.h" void Mult(char digitA[101],char digitB[101],int digitC[10001]) { int leghtA,leghtB; int i,j,k; int startA,startB,sum,pre,mark,Sub; leghtA=strlen(digitA)-1; leghtB=strlen(digitB)-1; startA=leghtA; startB=leghtB; Sub=0; for(i=0;i<10000;i++) digitC[i]=0; while(startA>=0) { mark=0; startB=leghtB; while(startB>=0) { sum=(digitA[startA]-'0')*(digitB[startB]-'0')+mark; digitC[Sub+(leghtB-startB)]+=sum; startB--; } startA--; Sub++; } mark=0; for(i=0;i<=Sub+leghtB;i++) { pre=(digitC[i]+mark)/10; digitC[i]=(digitC[i]+mark)%10; mark=pre; } while(mark!=0) { digitC[i++]=mark%10; mark=mark/10; } for(i=10000-1;i>=0;i--) if(digitC[i]!=0) break; if(i==-1) printf("%d",0); for(i;i>=0;i--) printf("%d",digitC[i]); printf("\n"); } int main() { char digitA[101],digitB[101]; int digitC[10000]; while(~scanf("%s%s",digitA,digitB)) { Mult(digitA,digitB,digitC); } }