【大数加法】
以求斐波拉契数列前五十项为例,展示大数加法。后序将会补充,使用链表的方式, 来进行大数操作。
int 能表示的范围是-2,147,483,648 ~ 2,147,483,647
在C语言中,在目前主流的64位环境下,long long类型最大值为9223372036854775807
#include <iostream>
#include <string.h>
#include <cstring>
#include <algorithm>
using namespace std;
string add(string a,string b){
a=a.substr(a.find_first_not_of('0'));//去除字符串a前面不必要的0
b=b.substr(b.find_first_not_of('0'));
long long lenA=a.length();
long long lenB=b.length();
long long len=max(lenA,lenB)+10;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());//翻转字符串a,b便于加法操作
string ans(len,'0');//初始化结果字符串,均为字符0
//先将字符串a拷贝到ans中
for(int i=0;i<lenA;i++){
ans[i]=a[i];
}
int tmp=0;//tmp是上一位相加后的进位
for(int i=0;i<len;i++){
if(i<lenB){//如果已经超出了字符串b的长度
tmp+=(ans[i]-'0')+(b[i]-'0');
}else{
tmp+=(ans[i]-'0');
}
ans[i]=tmp%10+'0';//当前位
tmp/=10;//进位
}
reverse(ans.begin(),ans.end());
return ans.substr(ans.find_first_not_of('0'));
}
int main(){
int n=50;
string a="1";
string b="2";
for(int i=3;i<=n;i++){
string tmp=b;
b=add(a,b);
a=tmp;
cout<<b<<endl;
}
//a,b是斐波拉契数列的第n和n+1项
}
【分治法——大数乘法】