码迷,mamicode.com
首页 > 其他好文 > 详细

大数加法

时间:2020-01-22 09:20:15      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:使用字符串   直接   图片   ever   str   编写   数值   存在   else   

问题描述:
计算机计算的数值位是有限的,当要计算两个很多位的数之和时,直接输入后是不能直接进行运算,所以要编写程序来模拟加法的运算过程,这样即使是两个成百,成千的位的数相加也是可以运算出来的.
技术图片

基本思路:大数加法是使用字符串来存储大数,并逐个按照位数相加;a串和b串可能含有前导0,所以substr()函数和find_first_not_of(‘0‘)函数除去前导0,使用reverse()函数将a串和b串反转以便后面从最低位开始运算,ans串存放的是最终结果,然后从最低位开始将ans串和b串相加,tem是上一位的进位,最终的ans串反转为从高位到低位的顺序.

下面是一个大数加法的模板

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string add(string a,string b)
{
    //除去字符串前面的前导0
    a=a.substr(a.find_first_not_of(‘0‘));
    b=b.substr(b.find_first_not_of(‘0‘));
    int lenA = a.length();
    int lenB = b.length();
    int len = max(lenA,lenB)+10;
    //将a串和b串反转,从最低位开始运算
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    string ans(len,‘0‘);
    //将a串拷贝到ans串
    for(int i = 0;i < lenA;++i)
    ans[i]=a[i];
    //tem是上一位的进位
    int tem=0;
    for(int i = 0;i < len;i++)
    {
    if(i<b.length())
    tem += (ans[i]-‘0‘)+(b[i]-‘0‘);
    else
    tem += (ans[i]-‘0‘);
    ans[i] = tem % 10 +‘0‘;
    tem /= 10;
    }
    //ans串和b串是从最低位开始运算,所以要将ans串反转从最高位到最低位
    reverse(ans.begin(),ans.end());
    //前面可能存在多余的前导0,返回之前截掉
    return ans.substr(ans.find_first_not_of(‘0‘));
}
int main()
{
    string a ="00001234";
    string b ="0005678";
    cout<<add(a,b)<<endl;
    return 0;
}

结果截图:
技术图片

大数加法

标签:使用字符串   直接   图片   ever   str   编写   数值   存在   else   

原文地址:https://blog.51cto.com/14472348/2468109

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!