[C++]高精度减法

01cebf26dadf4e8dbcb4d128e570cbf8.png

14400f5c2f8347f2915d083cb1a4687a.png 

 代码如图所示

思路:利用字符串存储输入的数据,并以逆序传入数组中。由于:(a<b)a-b=-(b-a)可以用if判断交换数据,方便计算,只需在程序最后输出符号(此处我用bool类型)。之后相减(若数组1中i下标元素小于数组2i下标元素,向后一位借,(相较逆序而言))为防止结果首位为零,寻找首位不为零的元素下标,输出数组时从该下标开始逆序输出。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于浮点数的高精度减法,可以将浮点数转化为字符串,然后按照高精度减法的思路进行计算,最后再将结果转化为浮点数。 以下是一个使用字符串实现高精度减法的例子: ```c++ #include <iostream> #include <string> #include <algorithm> // for reverse() using namespace std; string float_sub(string a, string b) { int lena = a.length(), lenb = b.length(); int dotPosa = a.find('.'), dotPosb = b.find('.'); int lenDeca = (dotPosa == -1 ? 0 : lena - dotPosa - 1); int lenDecb = (dotPosb == -1 ? 0 : lenb - dotPosb - 1); // 补足小数点后的0 if (lenDeca < lenDecb) { a.append(lenDecb - lenDeca, '0'); } else if (lenDecb < lenDeca) { b.append(lenDeca - lenDecb, '0'); } // 补足小数点前的0 if (dotPosa < dotPosb) { a.insert(0, dotPosb - dotPosa, '0'); } else if (dotPosb < dotPosa) { b.insert(0, dotPosa - dotPosb, '0'); } // 对齐后的长度 int len = max(lena, lenb); // 去掉小数点 a.erase(dotPosa, 1); b.erase(dotPosb, 1); // 翻转字符串方便计算 reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); // 计算 string c(len, '0'); int carry = 0; for (int i = 0; i < len; i++) { int numa = (i < lena ? a[i] - '0' : 0); int numb = (i < lenb ? b[i] - '0' : 0); int numc = numa - numb - carry; if (numc < 0) { numc += 10; carry = 1; } else { carry = 0; } c[i] = numc + '0'; } // 去掉前导0 while (c.length() > 1 && c.back() == '0') { c.pop_back(); } // 加上小数点 int lenDec = max(lenDeca, lenDecb); if (lenDec > 0) { c.insert(len - lenDec, "."); } // 翻转回来 reverse(c.begin(), c.end()); return c; } int main() { string a = "123.456"; string b = "78.9"; string c = float_sub(a, b); cout << c << endl; return 0; } ``` 这个例子中,我们首先将小数点后的0补足,然后将小数点前的0也补足,接着去掉小数点,翻转字符串,进行高精度减法计算,再去掉前导0,加上小数点,最后翻转回来,得到最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值