C语言大数相减(考虑相减为负数情况)
同时考虑到相减之后为负数的情况和相减之后为0的情况
#include <stdio.h>
#include <string.h>
int main()
{
int aa[100]={0},bb[100]={0},cc[100];
char a[100],b[100];
scanf("%s %s",a,b);
int m,n,len,flage1=0;
/*
flage1代表相减之后是否为负数
代表用前边那个数减后边那个数还是用后边那个数减去前边那个数
*/
m = strlen(a);
n = strlen(b);
int i;
/*
将大数字符串转化为整数并反转,单个储存在数组之中
*/
for(i = 0; i < m; i ++)
{
aa[i] = a[m - i-1] - '0';
}
for(i = 0; i < n; i ++)
{
bb[i] = b[n - i-1] - '0';
}
/*
判断第一个数与第二个数的大小,len取较大的一个数的长度
如果前面那个数较大,则flage1 = 0;如果后面的那个数较大,则flage1 = 1;
*/
if(m > n)
{
len = m;
flage1 = 0;
}
else if(m == n)
{
//当长度相同时,再逐个 位数比较来判断数的大小
len = m;
for(i = n - 1; i >= 0; i --)
{
if(aa[i] > bb[i])
{
flage1 = 0;
break;
}
if(aa[i] < bb[i])
{
flage1 = 1;
break;
}
}
}
else
{
len = n;
flage1 = 1;
}
if(flage1 == 0)
{
for(i = 0; i < len; i ++)
{
if(aa[i] >= bb[i])
cc[i] = aa[i] - bb[i];
else
{
aa[i] = aa[i] + 10;
aa[i+1] = aa[i+1] - 1;
cc[i] = aa[i] - bb[i];
}
}
}
if(flage1 == 1)
{
for(i = 0; i < len; i ++)
{
if(bb[i] >= aa[i])
cc[i] = bb[i] - aa[i];
else
{
bb[i] = bb[i] + 10;
bb[i+1] = bb[i+1] - 1;
cc[i] = bb[i] - aa[i];
}
}
}
//判断相减之后是否等于0 。。。例如:1111-1111=0000 经上边数组计算之后就会有4个0
int s = 0;
for(i = 0; i < len; i ++)
{
if(cc[i] == 0)
s = 0;
else
{
s = 1;
break;
}
}
if(s == 0) //s = 0就代表相减之后每个数组都储存的是 0,然后就输出一个0就行
{
printf("0\n");
}
if(s != 0)
{
if(flage1 == 0)
{
for(i = len-1; i >= 0; i --)
{
printf("%d",cc[i]);
}
printf("\n");
}
if(flage1 == 1)
{
printf("-");
for(i = len-1; i >= 0; i --)
{
printf("%d",cc[i]);
}
printf("\n");
}
}
return 0;
}