原帖及讨论:http://bbs.bccn.net/thread-214538-1-1.html 高精乘法 ----------------------------------------------------------------------- 先写个两个数的乘积 有空改成个多个数的积 ----------------------------------------------------------------------- #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] ; 注意格式的控制 这里得开两个数组 对了 还是请达人帮我解决前面这个零的问题吧 |