河南省工程建设信息网一体化平台太原百度快速优化
审题:
本题高精度减法主要是要区分正负号,然后进行模拟
思路:
方法一:模拟法首先本题需要我们利用字符串进行大数相减
第一步:区分s1和s2谁更大
先从数的位数进行判断,然后再从高到低的位数进行判断
第二步:确认谁大谁小后进行减法模拟
利用minus控制借位,借了为就置为-1,没有借就置为0
解题:
(1)主函数逻辑
int main() {cin >> s1 >> s2;bool judge = true;//判断大小if (s1.size() > s2.size()){minor(s1, s2);judge = false;}else if(s1.size()<s2.size()){minor(s2, s1);}else{int i = 0;while (i < s1.size() ){if (s1[i] >= s2[i]){minor(s1, s2);judge = false;break;}else if (s1[i] < s2[i]){minor(s2, s1);break;}i++;}}if (judge)//负数{cout << '-' << output;}else//正数{if (output[0] == '0'){cout << 0;}else{cout << output;}}return 0; }
第一步:判断大小并确认进入减法模拟的参数顺序,将大的数放在前面传参,小的数放在后面传参。并且用judge记录数的最终正负号,若是正数就是false,负数就是true
第二步:根据judge的状态对output进行输出
特殊处理:如果结果为0需要特殊处理,否则会输出很多个0
(2)减法模拟
void minor(string s1, string s2) {int minus = 0;//负数size_t big = s1.size();size_t small = s2.size();while (big > 0 || small > 0){int cur = minus;if(big > 0){big--;cur += s1[big]-'0';}if (small > 0){small--;cur -= s2[small]-'0';}char ch;if (cur < 0)//需要借位{ch = cur + 10 + '0';minus = -1;}else//无需借位{ch = cur + '0';minus = 0;}output = ch + output;} }
最终的数分两步进行计算
第一步:将借位数minus,s1字符串对应位和s2字符串对应位进行计算
第二步:若结果为负数就需要借位,将minus置为-1,不为负数就不用借位,将minus置为0
P2142 高精度减法 - 洛谷