(经典问题)大数加法

最近在找工作想把很多经典算法归一下档,把自己写的代码放在这里。

大数加法就是简单的用字符串模拟加法,但是代码不一定好写,写出来也不一定简洁,大数加法特别检验具体问题的抽象能力。这是也会发现,面向对象的设计方法比面向过程的方法更加符合人类思维。只是这些是以时间开销为代价的。

上代码

#include<stdio.h>
#include<string>
#include<iostream>

using namespace std;

string sum(string s1,string s2){
    string temp;
//把s1中放入长的那个字符串,这是第一个不好考虑的问题。那就是长短不一
    if(s1.length()<s2.length()){
        temp=s1;
        s1=s2;
        s2=temp;
    }

    int i,j;
    for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--){
        s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)) ; //这里j判断不能放到for语句里面,因为j<0时还要检查进位,这也是第二个不好考虑的问题。
        
        if(s1[i]-'0'>=10){
            s1[i]=(s1[i]-'0')%10+'0';

            if(i>=1)
                s1[i-1]++;
            else
                s1='1'+s1;//第三个不好考虑的问题就是进位,可能会进到溢出数组,当溢出的时候做一个处理。这就是面向对象设计的优势。
        }

    }

    return s1;
}

int main(){
    string s1,s2;
    cin>>s1>>s2;

    string s3=sum(s1,s2);
    //清除前导0,这也是面向对象设计的优势
    while(s3[0]=='0'&&s3.length()>1)
        s3.erase(s3.begin());
    cout<<s3<<endl;

    return 0;
}

另外,这里是题目链接:http://bailian.openjudge.cn/practice/2981/

最后是我的一些思考。

想到加法自然会涉及到减法,乘法,除法。但是另外的三种运算是可以全部变成加法运算的,其中原理就是用“补码”,补码的数学原理可以看我的另一篇博客,https://blog.csdn.net/ACM5100/article/details/104493121

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值