大數高精運算-----乘法

高精乘法 ----------------------------------------------------------------------- 先寫個兩個數的乘積 有空改爲個多個數的積 ----------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int i, j, k; char a1[50], a2[50]; int s1[50], s2[50]; int s[100]; void mul(int *s1, int *s2, int *s) {     for (i=0; i<strlen(a1); i++)         for (j=0; j<strlen(a2); j++)             s[i+j]+=s1[i]*s2[j];     int k=100;     while (!s[k])         --k;     for (i=0,j=0; i<=k; i++) {         s[i+1]+=s[i]/10;         s[i]%=10;     } } int main() { gets(a1); gets(a2);  int m=strlen(a1)+strlen(a2); for (i=strlen(a1)-1; i>=0; --i) s1[i]=(a1[strlen(a1)-i-1]-'0'); for (i=strlen(a2)-1; i>=0; --i) s2[i]=(a2[strlen(a2)-i-1]-'0'); for (i=0; i<100; i++) s[i]=0; mul(s1, s2, s); for (i=m-1; i>=0; --i)// printf("%d", s[i]); system("pause"); } --------------------------------------------- 1010101010101010101 1010101010101010101 輸出1020304050607080910090807060504030201 ---------------------------------------------- ----------------------------------------------- 輸入任意整數!!!!!!!!!辛苦修改 !!!!!! #include <stdio.h> #include <stdlib.h> int i, j, k; char a1[100], a2[100]; int s1[1000], s2[100]; int s[1000]; int temp=1; int main() {     gets(a1);     for (i=strlen(a1)-1; i>=0; --i)         s1[i]=(a1[strlen(a1)-i-1]-'0'); //上面的  是取得s1 而後轉爲int 數組         int m=strlen(a1);//提早算出a1 長度     while (gets(a2), strcmp(a2, "~")) {  //遇到~結束         for (i=strlen(a2)-1; i>=0; --i)             s2[i]=(a2[strlen(a2)-i-1]-'0');         for (i=0; i<100; i++)             s[i]=0;///s  初始化 開始計算了         for (i=0; i<m; i++)             for (j=0; j<strlen(a2); j++)                 s[i+j]+=s1[i]*s2[j];//開始計算了  結果保存到 s中         int k=1000;         while (!s[k])             --k;            // 算出s中的有效位數           m=m+strlen(a2);         for (i=0; i<=k; i++) {             s[i+1]+=s[i]/10;             s[i]%=10;         }         for (i=0; i<m; ++i)             s1[i]=s[i];      // temp++;  兩個數乘前面多兩個個零   三個數乘後面多三個零 不知道爲何  只能放個temp在這裏  使後面少輸出temp位       }     for (i=m; i>=0; --i)  //這裏改爲i=m-temp 就能夠少輸出前面的temp位   可是發現最前面若是要進位的話就會被去掉了  無奈。。。。。           printf("%d", s1[i]); } 改起來麻煩 因此就沒用函數  有點美中不足 前面的零很差去掉!。。。 輸入兩個數前面兩個零 輸入三個數 前面多三個零   -------------------------------------------------------------------- 999999999999999 999999999999999 999999999999999 999999999999999 ~ 輸出 0999999999999996000000000000005999999999999996000000000000001 -------------------------------------------------------------------------------------------終於完了 雖然寫的很醜~~~~~~~   總結 :方法相似於加法 除了這裏    s[i+j]+=s1[i]*s2[j] ;         注意格式的控制 這裏得開兩個數組
相關文章
相關標籤/搜索