高精度减法
思路:
模拟竖式减法。
同高精度加法。
区别在于进行减法时要判断两数的大小,计算完成后要注意高位的可能有多余的零,要忽略这些零(直接让其长度减1)但要保证结果至少有一位数。
假设第一个数为a,第二个数为b。若a<b记为-1,若a>b记为1,相等则记为0。当结果为-1时,传参数时要把b作为第一个参数,a作为第二个参数,保证接收的第一个参数始终大于第二个参数(假设sub函数规定第一个参数要大于或等于第二个参数)。否则参数顺序不变。
代码:
#include<cstdio> #include<cstring> struct bign{ int d[10100]; int len; bign(){ memset(d,0,sizeof(d)); len=0; } }; bign change(char str[]){//高低位转换 bign a; a.len=strlen(str); for(int i=0;i<a.len;i++){ a.d[i]=str[a.len-1-i]-'0';//字符串转为数字 } return a; } int compare(bign a,bign b){//比较a,b大小 if(a.len>b.len) return 1; else if(a.len<b.len) return -1; else{ for(int i=a.len-1;i>=0;i--){ if(a.d[i]>b.d[i]) return 1; else if(a.d[i]<b.d[i]) return -1; } } return 0;//两数相等 } bign sub(bign a,bign b){ bign c; for(int i=0;i<a.len || i<b.len;i++){ if(a.d[i]<b.d[i]){ a.d[i]+=10; a.d[i+1]--; } c.d[c.len++]=a.d[i]-b.d[i]; } while(c.len-1>=1 && c.d[c.len-1]==0){ c.len--; } return c; } void print(bign a){ for(int i=a.len-1;i>=0;i--){ printf("%d",a.d[i]); } } int main(){ char str1[10100],str2[10100]; scanf("%s%s",str1,str2); bign a=change(str1); bign b=change(str2); int flag=compare(a,b); if(flag==-1){//a小,输出负号,交换a,b,保证函数接收时,a始终大于b printf("-"); print(sub(b,a)); } else if(flag==1){ print(sub(a,b)); } else printf("0");//相等直接输出,节约时间 return 0; }

浙公网安备 33010602011771号