3115 高精度练习之减法——http://codevs.cn/problem/3115/
第一部分:题目
题目描述 Description
给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A-B的值
样例输入 Sample Input
3 12
样例输出 Sample Output
-9
数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位
第二部分:思路
具体看代码注释
第三部分:代码
#include<stdio.h> #include<string.h> void repai(char s[500],int len)//把数组倒置 { int i,j=len-1; char t; for(i=0;i<j;i++) { j=len-i-1;//相当于以中点对折。 t=s[i]; s[i]=s[j]; s[j]=t; } } void compute(char a[500],int alen,char b[500],int blen,char sign)//进行减法计算 { int result[501],length=0; int i,j,flag=0; repai(a,alen);//倒置 repai(b,blen); int t; for(i=0;i<alen&&i<blen;i++)//从个位开始相减 { t=a[i]-b[i]+flag; if(t<0)//判断是否需要借1 { t+=10; flag=-1; } else//这里稍微注意一下,当前不需要借1时置为0 { flag=0; } result[length++]=t; } while(i<alen) { t=a[i]-'0'+flag; if(t<0) { t+=10; flag=-1; } else { flag=0; } result[length++]=t; i++; } while(i<blen) { t=b[i]-'0'+flag; if(t<0) { t+=10; flag=-1; } else { flag=0; } result[length++]=t; i++; } if(flag==-1||sign=='-')//差为负有两种情况:1.被减数比减数短。2.被减数与减数一样长,但小 { printf("-"); } int begin=0;//用于减去前置0,比如123减120,数组中存的是003,00不要。 for(i=length-1;i>=0;i--) { if(result[i]==0&&begin==0) { begin=1; } else { begin=1; printf("%d",result[i]); } } printf("\n"); } int main() { char a[500],b[500];//接收数a、b scanf("%s %s",a,b); int alen,blen; alen=strlen(a);//数组a、b长度 blen=strlen(b); if(alen<blen)//数a比数b短,用b减a,差为负 { compute(b,blen,a,alen,'-'); } else { if(alen==blen&&strcmp(a,b)<0)//两个数长度相同时就需要进行比较了,用大的减小的 { compute(b,blen,a,alen,'-'); } else { compute(a,alen,b,blen,'+'); } } return 0; }
害怕失败的人,已经是一个loser!