题目描述
给定两个正整数a,b,且a>b,计算a-b,
难点在于,这里a,b未必能够用32位有符号整数表示。
输入
输入有多组数据,每组为一对a,b占一行,且a>b,范围均为1~10^24
输出
输出a和b的差
困惑:这里的a,b 该用什么定义,还需加点什么?
题目描述
给定两个正整数a,b,且a>b,计算a-b,
难点在于,这里a,b未必能够用32位有符号整数表示。
输入
输入有多组数据,每组为一对a,b占一行,且a>b,范围均为1~10^24
输出
输出a和b的差
困惑:这里的a,b 该用什么定义,还需加点什么?
说下原理,为了方便,我们用4位无符号整数/4位有符号整数来说明,你可以推广到32位。
在四位无符号整数中,咱们是这么表示的
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
分别是二进制的
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
而有符号整数,前面不变,还是 0 1 2 3 4 5 6 7,后面变了,变成了-8 -7 -6 -5 -4 -3 -2 -1
按照和有符号整数(以及上面二进制)对应排列起来就是 0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1
所以,要算减法,我们只要把每个数字+8(无论正负),因为减数被减数都+8,所以差不变。
0 1 2 3 4 5 6 7 这个 +8简单,直接+,结果变成 8 9 10 11 12 13 14 15
-8 -7 -6 -5 -4 -3 -2 -1 这个+8要注意,它们在无符号中事实上相当于 8 9 10 11 12 13 14 15
而我们实际上要得到0 1 2 3 4 5 6 7,所以我们实际上是减8
所以我们需要判断,如果原来的数字 > 0x7(也就是十进制的7),那么-8,否则+8
推广到32位,就是
如果大于 0x7FFFFFFF,那么减去 0x80000000
如果小于 0x7FFFFFFF,那么加上 0x80000000
然后再让调整过的两个数直接相减。
之前写错了。