基础算法-高精度:高精度减法
P2142 高精度减法题目链接P2142 高精度减法 - 洛谷高精度的题目解法和之前高精度加法的解法基本相同所以就不再过多讲解原理了。解法模拟列竖式计算的过程。①先用字符串读入然后拆分每一位逆序放在数组中。但是我们需要提前判断a与b的大小要让大的减小的所以需要先进行判断。我们在比较数字大小时最简便的方法就是先比较两者有多少位如果相同再从高到低依次比较。由于我们要把a和b先读取为字符串所以我们可以直接先比较a字符串与b字符串的长度用size()函数如果相同直接用return ab;因为在string中重定义了我们可以直接使用它来比较#includeiostream #includestring using namespace std; const int N 1e6 10; int a[N], b[N], c[N]; int la, lb, lc; //比较两个数字的大小 bool cmp(const string x, const string y) { //比较长度 if (x.size() ! y.size())return x.size() y.size(); //按照字典序的方式比较 return x y; } int main() { string x, y; cin x y; if (cmp(x, y)) { //如果xy则需要交换x,y swap(x, y); //记得输出-因为已经确定xy所以运算结果中必定有- cout -; } //拆分每一位逆序放到数组中 la x.size(); lb y.size(); lc max(la, lb); for (int i 0; i la; i) { a[la - i - 1] x[i] - 0;//x[i]为字符! } for (int i 0; i lb; i) { b[lb - i - 1] y[i] - 0; } //模拟减法过程 sub(c, a, b);//ca-b; //输出结果 for (int i lc - 1; i 0; i--) { cout c[i]; } return 0; }接下来就完善减法过程了。②利用数组模拟列竖式减法的过程1先是对应位相减如果结果小于0则需要借位记得是a[i]b[i]因为如果该位置被前一位借位了这个位置为-12处理借位该位置后面一个位置-1然后这个位置10c[i]10完善逻辑后的结果为#includeiostream #includestring using namespace std; const int N 1e6 10; int a[N], b[N], c[N]; int la, lb, lc; //比较两个数字的大小 bool cmp(const string x, const string y) { //比较长度 if (x.size() ! y.size())return x.size() y.size(); //按照字典序的方式比较 return x y; } //高精度减法的模板- ca-b void sub(int c[], int a[], int b[]) { for (int i 0; i lc; i) { c[i] a[i] - b[i]; if (c[i] 0) { --c[i 1];//借位 c[i] 10; } } } int main() { string x, y; cin x y; if (cmp(x, y)) { //如果xy则需要交换x,y swap(x, y); //记得输出-因为已经确定xy所以运算结果中必定有- cout -; } //拆分每一位逆序放到数组中 la x.size(); lb y.size(); lc max(la, lb); for (int i 0; i la; i) { a[la - i - 1] x[i] - 0;//x[i]为字符! } for (int i 0; i lb; i) { b[lb - i - 1] y[i] - 0; } //模拟减法过程 sub(c, a, b);//ca-b; //输出结果 for (int i lc - 1; i 0; i--) { cout c[i]; } return 0; }如果此时复制代码到题目上会有为什么我们可以发现如果最高位相减如9-9最终结果为0而我们输出的时候这个0是需要省略的也就是说如果999-997最终结果应该为2而这样输出结果为002其次如果ab也就是说999-999最终得到的结果是0而如果把所有0省略那么最终没有输出所以我们需要再加个条件lc1并使用while循环来去掉前置0我们可以使用--lc的方式来去掉多余的前置0#includeiostream #includestring using namespace std; const int N 1e6 10; int a[N], b[N], c[N]; int la, lb, lc; //比较两个数字的大小 bool cmp(const string x, const string y) { //比较长度 if (x.size() ! y.size())return x.size() y.size(); //按照字典序的方式比较 return x y; } //高精度减法的模板- ca-b void sub(int c[], int a[], int b[]) { for (int i 0; i lc; i) { c[i] a[i] - b[i];//对应位相减然后借位 if (c[i] 0) { --c[i 1];//借位 c[i] 10; } } //处理前导零 while (lc 1 c[lc - 1] 0) { --lc; } } int main() { string x, y; cin x y; if (cmp(x, y)) { //如果xy则需要交换x,y swap(x, y); //记得输出-因为已经确定xy所以运算结果中必定有- cout -; } //拆分每一位逆序放到数组中 la x.size(); lb y.size(); lc max(la, lb); for (int i 0; i la; i) { a[la - i - 1] x[i] - 0;//x[i]为字符! } for (int i 0; i lb; i) { b[lb - i - 1] y[i] - 0; } //模拟减法过程 sub(c, a, b);//ca-b; //输出结果 for (int i lc - 1; i 0; i--) { cout c[i]; } return 0; }这样就可以运行成功了每次写这种题目的时候我们都要想到边界情况不要盲目写即可。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2501272.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!