Loading

P1000 高精度加法

高精度问题

C语言解决高精度问题需要使用模拟的方法来解决问题。
我们进行模拟的时候要反过来,我们输入的时候要从低位往高位,但是我们算的时候要从高位往低位算。

代码案例

# include <iostream>
# include <string>
# include <algorithm>
using namespace std;
//返回一个string类结果;
string Add(string a,string b){
	if(a.length()<b.length()) a.swap(b) ;//要求效果a的长度大于b的长度
	string result(a.length(),0);//初步设置result长度为较长字符的长度,内容全部为0
	b.insert(0,a.length()-b.length(),'0');//较短的字符串前面补0方便计算
	int carry=0; //设置进位信号
	for(int i=a.length()-1;i>=0;i--){
		int sum=(a[i]-48)+(b[i]-48)+carry;
		carry = sum/10;
  		result[i]=sum%10+48;
	}
	if(carry!=0){
		result.insert(result.begin(),carry+48);			   
	}
	return result;
}
int main(){
	string a,b;
	while(cin>>a>>b)
	{
		cout<<Add(a,b)<<endl;
	}
	return 0;
}

函数分析

01-swap函数

Swap函数不是交换两个 容器的内容,而是交换了两个容器的内存地址。

if(a.length()<b.length()) a.swap(b) ;//要求效果a的长度大于b的长度

以上代码的涵义是:判断a的代码长度是否小于b的代码长度,如果小于,则进行转换,最终效果为a为较长的字符串,b为较短的字符串

02-string关键字

string result(a.length(),0);

以上代码的涵义是 :定义一个string类变量,变量名为result,长度为较长的字符串长度,内容为0

03-insert函数

b.insert(0,a.length()-b.length(),'0');//较短的字符串前面补0方便计算

在b的开头位插入a.length()-b.length()个'0',达到的效果为如果原本a=123,b=1,实际数组进行运算时候a=123,b=001,然后再倒过来运算。

	if(carry!=0){
		result.insert(result.begin(),carry+48);			   
	}

达到的效果是,如果产生了进位,则将进位插入到起始位置。

posted @ 2023-02-09 20:00  nliuc  阅读(37)  评论(0编辑  收藏  举报