大数加法
string Sum(string s1,string s2){
if(s1.length()<s2.length()) swap(s1,s2);
for(int i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--){
s1[i]=char(s1[i]+(j>=0?(s2[j]-'0'):0));
if(s1[i]-'0'>=10){
s1[i]=(s1[i]-'0')%10+'0';
if(i) s1[i-1]++;
else s1='1'+s1;
}
}
return s1;
}
大数减法
string Sub(string s1,string s2){
string res="";
int len1=s1.length(),len2=s2.length();
int len=max(len1,len2);
for(int i=len1;i<len;i++) s1="0"+s1;
for(int i=len2;i<len;i++) s2="0"+s2;
int f=0;
if(s1<s2){
f=1;
swap(s1,s2);
}
for(int i=len-1;i>=0;i--){
if(s1[i]<s2[i]){
s1[i]+=10;
s1[i-1]--;
}
char cmp=s1[i]-s2[i]+'0';
res=cmp+res;
}
int cur=0;
while(res[cur]=='0'&&cur<len) cur++;
if(cur==len) return "0";
if(f) return "-"+res.substr(cur);
return res.substr(cur);
}
大数乘法
string Multstr(string s1,string s2){
string res="";
int len1=s1.length(),len2=s2.length();
int num[500]={};
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++)
num[len1-1-i+len2-1-j]+=(s1[i]-'0')*(s2[j]-'0');
}
for(int i=0;i<len1+len2;i++){
num[i+1]+=num[i]/10;
num[i]=num[i]%10;
}
int cur=0;
for(int i=len1+len2;i>=0;i--)
if(num[i]!=0){
cur=i;break;
}
for(int i=cur;i>=0;i--)
res+=num[i]+'0';
return res;
}
大数乘法(乘以整数)
string Mult(string s,int x){
reverse(s.begin(),s.end());
int cmp=0;
for(int i=0;i<s.size();i++){
cmp=(s[i]-'0')*x+cmp;
s[i]=cmp%10+'0';
cmp/=10;
}
while(cmp){
s+=(cmp%10)+'0';
cmp/=10;
}
reverse(s.begin(),s.end());
return s;
}
大数除法(除以整数)
string Except(string s,int x){
int cmp=0,f=0;
string res="";
for(int i=0;i<s.size();i++){
cmp=cmp*10+s[i]-'0';
if(cmp>=x){
f=1;
res+=(cmp/x+'0');
cmp%=x;
}
else{
if(f) res+='0';
}
}
return res;
}