1.大数加法
string Add(string a,string b)
{
string c;
int len1=a.length();
int len2=b.length();
int len=max(len1,len2);
for(int i=len1;i<len;i++)
a="0"+a; //在前面加0
for(int i=len2;i<len;i++)
b="0"+b; //在前面加0
int ok = 0; //进位判断
for(int i=len-1;i>=0;i--) //从低位开始,即字符串最后开始
{
char tmp = a[i]+b[i]-'0'+ok;
if(tmp>'9')
{
ok = 1; //存在进位
tmp-=10;
}
else
ok=0;
c=tmp+c; //tmp加到高位去,即前面
}
if(ok)
c="1"+c;
return c;
}
2.大数减法
string Sub(string a,string b)
{
string c;
bool ok=false; //判断结果为正为负,初始假设为正
int len1=a.length();
int len2=b.length();
int len=max(len1,len2);
for(int i=len1;i<len;i++)
a="0"+a; //前面补0
for(int i=len2;i<len;i++)
b="0"+b; //前面补0
if(a<b) //
{
ok=true; //a<b说明结果为负,将标志变量ok置为true
string temp=a;
a=b;
b=temp; //交换a和b
}
for(int i=len-1;i>=0;i--) //从低位开始相减
{
if(a[i]<b[i]) //a一定是大于等于b的,所以不存在最高位还要借位的情况,数组不越界
{
a[i-1]-=1;
a[i]+=10;
}
char tmp = a[i]-b[i]+'0';
c=tmp+c; //高位加到前面去
}
int pos=0;
while(c[pos]=='0'&&pos<len)
pos++; //去掉前到0
if(pos==len) //说明a-b为0
return "0";
if(ok) //说明结果为负
return "-"+c.substr(pos);
return c.substr(pos); //返回c串的pos开始到结束的子串
}
3.大数乘法
//大数乘法(要用到大数加法)
string add(string a,string b)
{
string s;
int len1,len2;
len1=a.size()-1;
len2=b.size()-1;
int flag=0;
while(len1>-1&&len2>-1)
{
int sum=flag+(a[len1--]-'0')+(b[len2--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
while(len1>-1)
{
int sum=flag+(a[len1--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
while(len2>-1)
{
int sum=flag+(b[len2--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
if(flag)
s+=char('0'+flag);
int len=s.size()-1;
while(len>-1)
{
if(s[len]!='0')
break;
s=s.substr(0,s.size()-1);
len--;
}
for(int i=0;i<s.size()/2;i++)
{
char c=s[i];
s[i]=s[s.size()-i-1];
s[s.size()-i-1]=c;
}
if(s.size()==0)
s+='0';
return s;
}
string mul(string a,string b)//需要用到大数加
{
string s;
int len1=a.size();
int len2=b.size();
for(int i=0;i<len2;++i)
{
int num=b[len2-i-1]-'0';
int len=len1-1;
int flag=0;
string temp="";
while(len>-1)
{
int sum=flag+(a[len--]-'0')*num;
temp+=char ((sum)%10+'0');
flag=sum/10;
}
if(flag)
temp+=char('0'+flag);
len=temp.size();
for(int j=0;j<len/2;j++)
{
char c=temp[j];
temp[j]=temp[len-j-1];
temp[len-j-1]=c;
}
for(int j=0;j<i;++j)
temp+='0';
s=add(s,temp);
}
return s;
}
4.大数除法
string div(string a,int b)
{
string c;
int len=a.length();
int ans=0;
char s;
for(int i=0;i<len;i++)
{
ans=ans*10+a[i]-'0';
s=ans/b+'0';
ans%=b;
c+=s;
}
int pos=0;
while(pos<len && c[pos]=='0') pos++;
if(pos==len) return "0";
return c.substr(pos);
}
5.大数取模
int mod(string a,int x)
{
int len=a.length();
int ans=0;
for(int i=0;i<len;i++)
{
ans=(ans*10+a[i]-'0')%x;
}
return ans;
}