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