用到string这个类,要用
#include<string>
一:大数相乘:1.给的数是否有前导零(00 ,0011),
2.数组的大小要改
string mul(string a,string b)
{
if(a=="0"||b=="0")
return "0";
int e[100];//数组的大小要改
memset(e,0,sizeof(e));
int i=0,j=0;
int la=a.length()-1;
int lb=b.length()-1;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(i=0; i<=la; i++)
for(j=0; j<=lb; j++)
e[i+j]+=(a[i]-'0')*(b[j]-'0');
int t=la+lb+2;
for(i=0; i<=t; i++)
{
e[i+1]+=e[i]/10;
e[i]=e[i]%10;
}
for(i=t; i>=0; i--)
if(e[i])
break;
string s="";
if(i!=-1)//防止有多个零(000)
{
for(j=i; j>=0; j--)
s+=(e[j]+'0');
}
else
s="0";
return s;
}
二:大数相加
string add(string a,string b)
{
if(a=="0")
return b;
if(b=="0")
return a;
int la=a.size();
int lb=b.size();
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string c="";
int k=0,i;
for(i=0; i<la&&i<lb; i++)
{
int p=a[i]-'0'+b[i]-'0'+k;
c+=p%10+'0';
k=p/10;
}
while(i<la)
{
int p=a[i++]-'0'+k;
c+=p%10+'0';
k=p/10;
}
while(i<lb)
{
int p=b[i++]-'0'+k;
c+=p%10+'0';
k=p/10;
}
if(k)
c+=k+'0';
reverse(c.begin(),c.end());
return c;
}
3.大数相减
string sub(string a,string b)//代表a-b,数组大小要改,可以解决有前导零
{
int i,j,k,s,flag=1;
int tmpa[10000],tmpb[10000],c[10000];
string ans;
i=0;
for(i=0;i<a.size();i++)
if(a[i]!='0')
break;
if(i==a.size()) a="0";
else
{
string f=a;
a="";
for(;i<f.size();i++)
a+=f[i];
}
i=0;
for(i=0;i<b.size();i++)
if(b[i]!='0')
break;
if(i==b.size()) b="0";
else
{
string f=b;
b="";
for(;i<f.size();i++)
b+=f[i];
}
if(a.size()<b.size()||(a.size()==b.size()&&a<b))
{
string tmp=a;
a=b;
b=tmp;
flag=0;
}
while(a.length()>b.length()) b='0'+b;
int len=a.length();
for(i=0;i<len;i++)
{
tmpa[i]=a[i]-'0';
tmpb[i]=b[i]-'0';
}
for(i=len-1;i>=0;i--)
{
if(tmpa[i]>=tmpb[i])
c[i]=tmpa[i]-tmpb[i];
else
{
c[i]=10+tmpa[i]-tmpb[i];
tmpa[i-1]--;
}
}
for(i=0;i<len-1;i++)
{
if(c[i]!=0)
break;
}
for(j=i;j<len;j++)
{
ans=ans+(char)(c[j]+'0');
}
if(!flag)
{
ans='-'+ans;
}
return ans;
}