
```#include<stdio.h>
#include<string.h>
//大数减法妙的地方
//1.用字符串存储大数
//2.将字符转为数字,倒序存入数组,倒序用的很妙
//3.倒序后可以巧妙处理位数不同时的情况具体看注释,只要传入较长的位数即可
int z[100005];//
void sub(int* x, int* y, int len)//默认x是较大数
{
int i = 0;
int j = 0;
for(i = 0; i<len; i++)//100 - 9 就数组布局是 001 - 900 得出 190
{
if(x[i] - y[i] >= 0)//这种情况直接减
{
z[i] = x[i] - y[i];
}
else
{
z[i] = x[i] +10 - y[i];//借10
x[i+1]-=1;//下一位减1
}
}
for(i = len-1; i>0; i--)//既然是减法,z的最多位数也就是len,最少是1,所以假设他有最多位数len,如果没有len位,那比实际位数多的那部分肯定就是0,然后删去多余的前缀0即可,len最少都得是1
{
if(z[i] == 0)
{
len--;
}
else
{
break;
}
}
for(i = len-1; i >=0; i--)
{
printf("%d", z[i]);
}
}
int main()
{
char a[100005] = {0};//用字符串将大数进行存储
char b[100005] = {0};
int x[100005] = {0};
int y[100005] = {0};
scanf("%s%s", a, b);
int len1 = strlen(a);
int len2 = strlen(b);
int i = 0;
int k = 0;
for(i = len1-1, k = 0; i>=0; i--)//将字符串的字符转换为数字,并倒序存入数组里
{
x[k++] = a[i] - '0';
}
for(i = len2-1, k = 0; i>=0; i--)//将字符串的字符转换为数字,并倒序存入数组里
{
y[k++] = b[i] - '0';
}
//设个函数默认 大数减去小数,可以有效处理负号的情况,学到没?
if(len1 > len2)//相当正常
{
sub(x, y, len1);
}
else if(len1 < len2)//小了
{
printf("-");
sub(y, x, len2);
}
else//位数相同
{
for(i = len1 -1; i>=0; i--)//位数相同,len1 len2用谁都一样,从最高位开始比
{
if(x[i] == y[i])
{
if(i == 0)//能到达这步说明两个数完全一样
{
printf("0");
}
continue;
}
if(x[i] > y[i])//x大
{
sub(x, y, len1);
break;
}
else // y[i]大
{
printf("-");
sub(y, x, len2);
break;
}
}
}
return 0;
}