| 蝈蝈的a-b(middle) | |
|---|
| TimeLimit:1000MS MemoryLimit:64MB |
| 64-bit integer IO format:%lld |
| 已解决 | 点击收藏 |
| Problem Description |
| 顾名思义,输入整数 a 和 b,输出 a - b |
| |
| Input |
| 输入一行两个整数 a 和 b(1 ≤ lena,lenb ≤ 1e5,其中 lena 和 lenb 分别为数字 a 和 b 的长度,数字 a 和 b 均为非负数,且不会带前缀 0,除非该数字本身就是 0) |
| |
| Output |
| 输出一行表示答案(请不要带前缀 0,除非输出的数字本身就是 0) |
| |
| SampleInput |
| 1 2 |
| SampleOutput |
| -1 |
//大数减法妙的地方
//1.用字符串存储大数
//2.将字符转为数字,倒序存入数组,倒序用的很妙
//3.倒序后可以巧妙处理位数不同时的情况具体看注释,只要传入较长的位数即可
int z[100005]
void sub(int* x, int* y, int len)//默认x是较大数
{
int i = 0
int j = 0
for(i = 0
{
if(x[i] - y[i] >= 0)//这种情况直接减
{
z[i] = x[i] - y[i]
}
else
{
z[i] = x[i] +10 - y[i]
x[i+1]-=1
}
}
for(i = len-1
{
if(z[i] == 0)
{
len--
}
else
{
break
}
}
for(i = len-1
{
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
{
x[k++] = a[i] - '0'
}
for(i = len2-1, k = 0
{
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
{
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
}