C++高精度减法

  1. 超长正整数的减法
    【问题描述】
    编写程序实现两个超长正整数(每个最长80位数字)的减法运算。

【输入形式】

从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。

  1. 第一行是超长正整数A;
  2. 第二行是超长正整数B;

【输出形式】
输出只有一行,是长整数A减去长整数B的运算结果,从高到低依次输出各位数字。要求:若结果为0,则只输出一个0;否则输出的结果的最高位不能为0,并且各位数字紧密输出。
【输入样例】

234098
134098703578230056

【输出样例】
-134098703577995958

【样例说明】
进行两个正整数减法运算, 234098 -134098703578230056 = -134098703577995958。

【评分标准】
完全正确得20分,每个测试点4分。

我就差个高精度除法没写过了在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
char a1[100000],b1[100000];
int a[100000],b[100000],c[100000];
int i,j;
bool cmp(void){
   
	if(a[0]!=b[0])return a[0]>b[0];
	for
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值