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);
}
达到的效果是,如果产生了进位,则将进位插入到起始位置。