大整数加法
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 }