大整数加减

大整数加法

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=205;
 5 
 6 int getLeadingAmount(char str[]){
 7     int amount=0;
 8     while(str[amount]=='0')amount++;
 9     return amount;
10 }
11 void removeLeading(char str[],int arr[]){
12     // memset(arr,0,sizeof(arr));
13     arr[0]=strlen(str)-getLeadingAmount(str);
14     for(int i=1;i<=arr[0];i++){
15         arr[i]=str[strlen(str)-i]-48;
16     }
17 }
18 //额外收获
19 //strlen is defined in header '<cstring>'
20 int main(){
21     //两个不超过200位的非负整数
22     //最终结果可能为0
23     //每个加数可能有多余的前导0
24 
25     //结果最小位数为加数最大位数
26     //结果最大位数为加数最大位数+1
27     char str1[N],str2[N];
28     cin>>str1>>str2;
29     int a[N],b[N];
30     //去除前导并完成数据初始化
31     memset(a,0,sizeof(a));
32     removeLeading(str1,a);
33     memset(b,0,sizeof(b));
34     removeLeading(str2,b);
35 
36     //核心算法
37     int len_res=max(a[0],b[0]);
38     for(int i=1;i<=len_res;i++){
39         a[i+1]+=(a[i]+b[i])/10;
40         a[i]=(a[i]+b[i])%10;
41     }
42     //输出结果
43     if(a[len_res+1]>0||len_res<=1)cout<<a[len_res+1];
44     for(int i=len_res;i>0;i--){
45         cout<<a[i];
46     }
47     return 0;
48 }

大整数减法

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=205;
 5 
 6 void init(char str[],int arr[]){
 7     arr[0]=strlen(str);
 8     for(int i=1;i<=arr[0];i++){
 9         arr[i]=str[arr[0]-i]-48;
10     }
11 }
12 int main(){
13     //两个正整数
14     //结果一定大于0,输入无前导0
15 
16     char str1[N],str2[N];
17     cin>>str1>>str2;
18     int a[N],b[N];
19     memset(a,0,sizeof(a));
20     init(str1,a);
21     memset(b,0,sizeof(b));
22     init(str2,b);
23 
24     for(int i=1;i<=a[0];i++){
25         if(a[i]-b[i]<0){
26             a[i+1]--;
27             a[i]+=10;
28         }
29         a[i]-=b[i];
30     }
31     //处理多余的0
32     while(a[a[0]]==0)a[0]--;
33     for(int i=a[0];i>0;i--){
34         cout<<a[i];
35     }
36     return 0;
37 }

 

posted @ 2021-07-31 20:40  Rekord  阅读(53)  评论(0编辑  收藏  举报