审题:
本题高精度减法主要是要区分正负号,然后进行模拟
思路:
方法一:模拟法首先本题需要我们利用字符串进行大数相减
第一步:区分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
补充:其实在判断谁大谁小的size相同部分我们也可以用strcmp直接比较字符串,因为strcmp的比较逻辑就是依次比较从0索引开始的字符
算法题(119):高精度减法
于 2025-04-07 23:10:08 首次发布