大数加法:来自
string sum(string s1,string s2)//大数加法
{
if(s1.size()<s2.size())
{
string t=s1;s1=s2;s2=t;
}//始终保持s1更长
int i,j;
for(i=s1.size()-1,j=s2.size()-1;i>=0;i--,j--)
{
s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节
if(s1[i]-'0'>=10)//如果需要进位
{
s1[i]=char((s1[i]-'0')%10+'0');
if(i) s1[i-1]++;//只要没有到零就进一位
else s1='1'+s1;//如果到了零,这样处理
}
}
return s1;
}
大数减法:来自
string sub(string a,string b)
{
string c;
bool ok=0;
int len1=a.length();
int len2=b.length();
int len=max(len1,len2);
for(int i=len1;i<len;i++)
a="0"+a;
for(int i=len2;i<len;i++)
b="0"+b;
if(a<b)
{
string temp=a;
a=b;
b=temp;
ok=1;
}
for(int i=len-1;i>=0;i--)
{
if(a[i]<b[i])
{
a[i-1]-=1;
a[i]+=10;
}
char temp=a[i]-b[i]+'0';
c=temp+c;
}
int pos=0;
while(c[pos]=='0' && pos<len) pos++;
if(pos==len) return "0";
if(ok) return "-"+c.substr(pos);
return c.substr(pos);
}
大数乘法:
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1011],s2[1011];
int len1,len2,a[1011],b[1011],c[2011];
int main()
{
scanf("%s%s",s1,s2);
len1=strlen(s1);len2=strlen(s2);
int x=0,y=0;
for(int i=len1-1;i>=0;i--) a[++x]=s1[i]-'0';a[0]=x;
for(int i=len2-1;i>=0;i--) b[++y]=s2[i]-'0';b[0]=y;
for(int i=1;i<=a[0];i++)
for(int j=1;j<=b[0];j++)
{
c[i+j]+=(c[i+j-1]+a[i]*b[j])/10;
c[i+j-1]=(c[i+j-1]+a[i]*b[j])%10;
}
c[0]=a[0]+b[0];
while(!c[c[0]]&&c[0]>1) c[0]--;
for(int i=c[0];i;i--) printf("%d",c[i]);
}
大数除法: