大数高精运算-----乘法

高精乘法 ----------------------------------------------------------------------- 先写个两个数的乘积 有空改为个多个数的积 ----------------------------------------------------------------------- #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] ;         注意格式的控制 这里得开两个数组
相关文章
相关标签/搜索