第一个程序--高精度乘法
高精度乘法(注释写的应该算是比较详细了)
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N=105; 5 int ans[2*N]; 6 int findLen(char c[]){ 7 for(int k=0;k<N;k++){ 8 if(c[k]<'0'){ 9 return k; 10 } 11 } 12 return -1; 13 } 14 void reverseArr(char c[],int len){ 15 int tmp; 16 for(int k=0;k<len/2;k++){ 17 tmp=c[k]; 18 c[k]=c[len-k-1]; 19 c[len-k-1]=tmp; 20 } 21 } 22 int main(){ 23 char a[N],b[N]; 24 //养成习惯,对代码进行必要的注释 25 //M位数*N位数最大位数为M+N,M位数*N位数最小位数为M+N-1————》确定结果位数 26 //由于乘数位数过高,均使用数组存放,并记录乘数数组有效长度 27 //输入 28 scanf("%s",a); 29 scanf("%s",b); 30 //寻找数组有效长度 31 int len_a=findLen(a),len_b=findLen(b); 32 //初步处理数据--》位置倒转 33 reverseArr(a,len_a); 34 reverseArr(b,len_b); 35 //核心算法 36 for(int i=0;b[i]>='0';i++){//乘数 37 for(int j=0;a[j]>='0';j++){//被乘数 38 ans[i+j]+=(b[i]-48)*(a[j]-48); 39 } 40 } 41 // 对数据进行最终处理 42 for(int k=0;k<len_a+len_b-1;k++){ 43 ans[k+1]+=ans[k]/10; 44 ans[k]%=10; 45 } 46 //输出结果 47 if(ans[len_a+len_b-1]>0){ 48 cout<<ans[len_a+len_b-1]; 49 } 50 for(int k=len_a+len_b-2;k>=0;k--){ 51 cout<<ans[k]; 52 } 53 return 0; 54 }
额外收获:
- 当使用scanf输入字符串时,space和enter都能中断输入,且中断字符不会被输入。
- 中断字符(space/enter)不会影响下一个scanf。
- 全局数组将自动完成初始化,字符数组默认为空,整型数组默认为0。
- 局部数组不会初始化,所以不能使用数组没有初始化的位置的值。
- scanf/printf来自于
cstdio
头文件。
二刷代码:
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 const int N=205; 6 7 void init(char str[],int arr[]){ 8 arr[0]=strlen(str); 9 for(int i=1;i<=arr[0];i++){ 10 arr[i]=str[arr[0]-i]-48; 11 } 12 } 13 int main(){ 14 char str1[N],str2[N]; 15 cin>>str1>>str2; 16 int a[N],b[N]; 17 memset(a,0,sizeof(a)); 18 init(str1,a); 19 memset(b,0,sizeof(b)); 20 init(str2,b); 21 22 int ans[2*N]; 23 memset(ans,0,sizeof(ans)); 24 for(int i=1;i<=b[0];i++){ 25 for(int j=1;j<=a[0];j++){ 26 ans[i+j-1]+=a[j]*b[i]; 27 } 28 } 29 //确定结果初始长度 30 ans[0]=a[0]+b[0]-1; 31 //处理数据 32 for(int i=1;i<=ans[0];i++){ 33 ans[i+1]+=ans[i]/10; 34 ans[i]%=10; 35 if(ans[ans[0]+1]>0)ans[0]++; 36 } 37 //输出结果 38 for(int i=ans[0];i>0;i--)cout<<ans[i]; 39 return 0; 40 }