【高精度计算 02】 大整数乘法
2015-11-13 19:36
453 查看
大整数乘法 算法: #include<iostream> #include<stdio.h> using namespace std; #define MAX 100 void GetNum(char *s){ scanf("%s",s); } //字符串转换成整形数组 void convert(char *s1,int *a){ int len1=strlen(s1); for(int i=0;i<=len1;i++){ a[len1-1-i]=s1[i]-'0'; //逆序输出数组 } } //交叉乘积,进行累加 void multiNum(char *s1,char *s2,int *a,int *b,int *c){ int len1=strlen(s1); int len2=strlen(s2); for(int i=0;i<=len1;i++){ for(int j=0;j<=len2;j++){ c[i+j]+=a[i]*b[j]; } } } void result(char *s1,char *s2,int *c){ int len1=strlen(s1); int len2=strlen(s2); int len=len1+len2; //处理进位的问题 for(int i=0;i<len;i++){ c[i+1]+=c[i]/10; c[i]=c[i]%10; } //输出结果 int j=len; while(c[i]==0&&i>0) i--; if(i<0) printf("0"); else{ while(i>=0) printf("%d",c[i--]); } printf("\n"); } void main(){ char s1[MAX],s2[MAX]; int c[MAX*2],a[MAX],b[MAX]; GetNum(s1); GetNum(s2); //输入两个字符串 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); convert(s1,a); convert(s2,b); //将字符数组转化为整形数组 multiNum(s1,s2,a,b,c); //求积 result(s1,s2,c); //输出最后的结果 }
算法思想:
———————————————————————————-
两个大数相乘,就是使用每一位与另外一个进行相乘,然后使用交叉相加,
最后数组的每一位仅保留末尾一位,逐步累加,最后输出数组。
8 7 6 5 * 16 14 12 10 2 24 21 18 15 3 32 28 24 20 4
16 14 12 10 24 21 18 15 32 28 24 20 16 38 65 56 39 20
16 38 65 56 39 20 2 16+4=20 38+7=45 65+6=71 56+4=60 39+2=41 留2 留0进2 留5进4 留1进7 留0进6 留1进4 留0进2 2 0 5 1 0 1 0
相关文章推荐
- C#实现矩阵乘法实例分析
- JavaScript 字符串乘法
- JavaScript实现MIPS乘法模拟的方法
- php实现俄罗斯乘法实例
- python3.3实现乘法表示例
- 大整数的加减乘除求余
- VIJOS P1040 高精度乘法
- 一元多项式的加法和乘法运算
- 1874. Three little pigs
- 偶数之和
- Sicily 1166 Computer Transformat
- hdu 1217 Arbitrage (Floyd算法)
- 阶乘——高精度求法
- [BZOJ1089][SCOI2003][递推][高精度]严格n元树
- HDU1063 Exponentiation
- lab104_2
- POJ1001大数相乘
- POJ1503大数相加
- 高精度计算bign类
- 424 Integer Inquiry题解