3115 高精度练习之减法
题目描述 Description给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。
输入描述 Input Description读入两个用空格隔开的正整数
输出描述 Output Description输出A-B的值
样例输入 Sample Input3 12
样例输出 Sample Output-9
数据范围及提示 Data Size & Hint两个正整数的位数不超过500位
首先判断结果正负,保留符号,将较大的值放在被减数。然后模拟减法过程,注意借位运算。
附AC代码:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int MAX=510; 6 int a[MAX],b[MAX],c[MAX]; 7 8 void ex(char *s1,char*s2){//交换函数 9 char temp[MAX]; 10 strcpy(temp,s1); 11 strcpy(s1,s2); 12 strcpy(s2,temp); 13 } 14 15 int main(){ 16 char al[MAX],bl[MAX]; 17 int sign,t; 18 cin>>al>>bl; 19 memset(a,0,sizeof(a)); 20 memset(b,0,sizeof(b)); 21 memset(c,0,sizeof(c)); 22 int lena=strlen(al); 23 int lenb=strlen(bl); 24 if(lena<lenb){//决定符号的正负 25 sign=-1; 26 ex(al,bl);//结果为负时保存负号,两数交换 27 t=lena; 28 lena=lenb; 29 lenb=t; 30 } 31 else if(lena==lenb){ 32 for(int i=0;i<lena;i++){//长度相等时从最大位到最小位依次比较 33 if(al[i]<bl[i]){ 34 sign=-1; 35 ex(al,bl); 36 break; 37 } 38 else if(al[i]>bl[i]){ 39 sign=1; 40 break; 41 } 42 else 43 sign=1; 44 } 45 } 46 else 47 sign=1; 48 49 for(int i=0;i<lena;i++){//反向输入数组 50 a[lena-i]=al[i]-48; 51 } 52 for(int i=0;i<lenb;i++){ 53 b[lenb-i]=bl[i]-48; 54 } 55 for(int i=1;i<=lena;i++){//模拟减法运算 56 if(a[i]>=b[i]){ 57 c[i]=a[i]-b[i]; 58 } 59 else{ 60 t=i+1; 61 a[t]-=1; 62 c[i]=a[i]+10-b[i]; 63 } 64 } 65 if(c[lena]==0)//防止首位为0 66 lena--; 67 cout<<c[lena]*sign;//输出首位和符号 68 for(int i=lena-1;i>=1;i--){//依次输出各位的值 69 cout<<c[i]; 70 } 71 cout<<endl; 72 return 0; 73 }