详细C++高精度加法

这篇博客详细介绍了如何使用C++通过字符串操作实现高精度加法。首先,将两个数字的字符串反转并移除前导零,然后确定最大长度以防止溢出,接着初始化答案字符串并将一个字符串复制进去。在计算过程中,采用逢十进一的方法,用临时变量处理进位。最后,反转答案字符串并去除前导连续的零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++高精度加法

#include <string>
#include <iostream>
#include<algorithm>
#define ll long long
using namespace std;

string add(string a,string b){//大数的加法 
	a=a.substr(a.find_first_not_of('0')); //去掉字符串开始的0 
	b=b.substr(b.find_first_not_of('0'));
	
	ll lenA=a.length();
	ll lenB=b.length();
	ll len=max(lenA,lenB)+10;
	//翻转便于求和 
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	
	string ans(len,'0'); //初始化ans为0
	
	//将a拷贝到ans中
	for(int i=0;i<lenA;++i){
		ans[i]=a[i];
	}
	int tmp=0;//用来进位0<=tmp<=18 
	for(int i=0;i<len;++i){
		if(i<b.length()) tmp+=(ans[i]-'0')+(b[i]-'0'); //判断a,b的长度 
		else tmp+=(ans[i]-'0');
		ans[i]=tmp%10+'0';
		tmp/=10;//假设位18保留1
	}
	reverse(ans.begin(),ans.end());//结果反转
	return ans.substr(ans.find_first_not_of('0'));
}



int main(){
	string a="1";
	string b="9876543210"; 
	cout<<add(a,b)<<endl; 
	return 0;
}

思想

  1. 用字符串来实现C++高精度加法
  2. 因为是从后往前加,先将两个字符串反转,去掉字符串前面的0,防止出错
	a=a.substr(a.find_first_not_of('0')); //去掉字符串开始的0 
	b=b.substr(b.find_first_not_of('0'));
//翻转便于求和 
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
  1. 求2个字符串最大长度,在加10用于防止答案字符串溢出
	ll lenA=a.length();
	ll lenB=b.length();
	ll len=max(lenA,lenB)+10;
  1. 初始化答案字符串,并将a字符串复制到ans字符串中
	string ans(len,'0'); //初始化ans为0
	
	//将a拷贝到ans中
	for(int i=0;i<lenA;++i){
		ans[i]=a[i];
	}

5.计算过程:遇十进一,并用tmp变量进行进制处理

	int tmp=0;//用来进位0<=tmp<=18 
	for(int i=0;i<len;++i){
		if(i<b.length()) tmp+=(ans[i]-'0')+(b[i]-'0'); //判断a,b的长度 
		else tmp+=(ans[i]-'0');
		ans[i]=tmp%10+'0';
		tmp/=10;//假设位18保留1
	}

6.结果:将ans字符串反转,并去掉最前面连续的0

	reverse(ans.begin(),ans.end());//结果反转
	return ans.substr(ans.find_first_not_of('0'));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值