最近在找工作想把很多经典算法归一下档,把自己写的代码放在这里。
大数加法就是简单的用字符串模拟加法,但是代码不一定好写,写出来也不一定简洁,大数加法特别检验具体问题的抽象能力。这是也会发现,面向对象的设计方法比面向过程的方法更加符合人类思维。只是这些是以时间开销为代价的。
上代码
#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.youkuaiyun.com/ACM5100/article/details/104493121