大数模板

来源:互联网 发布:淘宝宝贝视频拍摄技巧 编辑:程序博客网 时间:2024/06/07 06:17

用到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;}