大整数减法日常练习总结
对于大整数问题,逻辑1.先是比较两输入字符串的大小,经检验,strcmp只能比较相同位数的两串,不同位数会按照
较短那串的位数进行比较,故不能满足任意大整数的两两比较,
对于完美实现,要判断二者位数长度时,要么直接能对比出长度先,要么二者同长时用strcmp。故语句为if(la>lb||(la==lb&&strcmp(a,b)>0))
2.在对比大小之后,进行加减操作,加减时要注意的是进位和舍位操作,计算机语言为负数加十为进位,整数减十为舍位
int main()
{
int la,lb,maxlen,k;
char a[100],b[100];
int a1[100]={0},b1[100]={0};
int i,m;
char r[100];
gets(a); //输入的数字a,是个字符串
gets(b); //输入的数字b
la=strlen(a); //a数字的记位器
lb=strlen(b); //b的
if(la>lb)
maxlen=la; //如果 a 位数长,那么 a 当大数
else
maxlen=lb; //反之则 b
if(la>lb||(la==lb&&strcmp(a,b)>0)) //两字符串比较(即为俩数字比较)a > b 时
{
m=maxlen; //m 用来存刚才对比过后的二者中较大的位数 maxlen
for(i=0;i<la;i++,m--) //
a1[m]=a[la-1-i]-'0';//这里是进行了将输入的字符串变成数字数组的操作,
//注意最高位空出来,防止溢出
m=maxlen;
for(i=0;i<lb;i++,m--)
b1[m]=b[lb-1-i]-'0';//减去字符0就是减去了32,字符串串变成了数字串存每个数字
}
else //这里为后面进行b串-a串的操作做准备
{
m=maxlen;
for(i=0;i<lb;i++,m--)
a1[m]=b[lb-1-i]-'0'; //改写a1串,注意这是else,a1存大的,此时b是大的,把b放a1中
m=maxlen;
for(i=0;i<la;i++,m--)
b1[m]=a[la-1-i]-'0'; //改写b1串
}
//减法(在二者在上面进行了比较为大小之后,这里直接进行大数减小数
for(i=maxlen;i>=0;i--)
{
a1[i]-=b1[i];
if(a1[i]<0)//这里是进行了借位,如 1-8,等于3,在计算机中实则是 -7+10
{
a1[i]=a1[i]+10;
a1[i-1]--;//借了位被借位处要减一
}
}
if(la<lb||(la==lb&&strcmp(a,b)<0))//两字符串比较(即为俩数字比较)a < b 时
printf("-");//这个if就是为了输出这个负号
for(i=1;i<=maxlen;i++)
printf("%d",a1[i]);
}