第一个程序--高精度乘法

高精度乘法注释写的应该算是比较详细了

 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 }

 

posted @ 2021-07-31 09:44  Rekord  阅读(57)  评论(0编辑  收藏  举报