C++高精度减法

C++高精度减法题目描述洛谷编号:2142高精度减法。输入输出格式输入格式:两个整数a,b(第二个可能比第一个大)。输出格式:结果(是负数要输出负号)。输入输出样例输入样例1:21输出样例1:1数据规模与约定20%数据a,b在long long范围内100%数据0<a,b<=10的10000次方这个程序主要使用数组解决长整型不能存储的问题程序如下...
摘要由CSDN通过智能技术生成

C++高精度减法

题目描述
洛谷编号:2142
高精度减法。
输入输出格式
输入格式:
两个整数a,b(第二个可能比第一个大)。
输出格式:
结果(是负数要输出负号)。
输入输出样例
输入样例1:
2
1
输出样例1:

1

数据规模与约定
20%数据a,b在long long范围内
100%数据0<a,b<=10的10000次方

这个程序主要使用数组解决长整型不能存储的问题
程序如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char a[100010],b[100010];
    	cin>>a>>b;
    
    int c[100010],d[100010],jg[100010];
	int n1,n2;
	int i;
	int f=0,l=0;
    n1=strlen(a);
    n2=strlen(b);
    for(i=0;i<n1/2;i++){
    	
		swap(a[i],a[n1-1-i]);
	}
    for(i=0;i<n2/2;i++){
    	
		swap(b[i],b[n2-1-i]);
	}
    for(i=0;i<n1;i++){
    	
		c[i]=a[i]-'0';
	} 
    for(i=0;i<n2;i++){
    	
		d[i]=b[i]-'0';
	}
    if
  • 1
    点赞
  • 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、付费专栏及课程。

余额充值