高精度乘法(注释写的应该算是比较详细了)
#include<iostream> #include<cstdio> using namespace std; const int N=105; int ans[2*N]; int findLen(char c[]){ for(int k=0;k<N;k++){ if(c[k]<'0'){ return k; } } return -1; } void reverseArr(char c[],int len){ int tmp; for(int k=0;k<len/2;k++){ tmp=c[k]; c[k]=c[len-k-1]; c[len-k-1]=tmp; } } int main(){ char a[N],b[N]; //养成习惯,对代码进行必要的注释 //M位数*N位数最大位数为M+N,M位数*N位数最小位数为M+N-1————》确定结果位数 //由于乘数位数过高,均使用数组存放,并记录乘数数组有效长度 //输入 scanf("%s",a); scanf("%s",b); //寻找数组有效长度 int len_a=findLen(a),len_b=findLen(b); //初步处理数据--》位置倒转 reverseArr(a,len_a); reverseArr(b,len_b); //核心算法 for(int i=0;b[i]>='0';i++){//乘数 for(int j=0;a[j]>='0';j++){//被乘数 ans[i+j]+=(b[i]-48)*(a[j]-48); } } // 对数据进行最终处理 for(int k=0;k<len_a+len_b-1;k++){ ans[k+1]+=ans[k]/10; ans[k]%=10; } //输出结果 if(ans[len_a+len_b-1]>0){ cout<<ans[len_a+len_b-1]; } for(int k=len_a+len_b-2;k>=0;k--){ cout<<ans[k]; } return 0; }
额外收获:
<cstdio>
头文件。