高精度除法

来源:互联网 发布:北京三一重工java招聘 编辑:程序博客网 时间:2024/05/16 14:11

高精度除法,其实还是模拟,不过需要结合高精度加法、减法进行模拟

#include<iostream>#include<string>using namespace std;string rev(string a){    string ret=a;    int n=a.size();    for(int i=0;i<n/2;i++)    {    swap(ret[i],ret[n-i-1]);//得到逆序字符串     }    return ret;}string add(string a,string b)//大整数加法 {    int lena=a.size();    int lenb=b.size();    a=rev(a);    b=rev(b);    int carry=0;    string c;    int i;    for(i=0;i<lena&&i<lenb;i++)    {        int ai=a[i]-'0';        int bi=b[i]-'0';        int ci=ai+bi+carry;        c+=(ci%10)+'0';//(ci%10)+'0'整体是一个字符,即(char)((ci%10)+'0')         carry=ci/10;    }    for(;i<lena;i++)    {        int ai=a[i]-'0';        int ci=ai+carry;        c+=(ci%10)+'0';        carry=ci/10;    }    for(;i<lenb;i++)    {        int bi=b[i]-'0';        int ci=bi+carry;        c+=(ci%10)+'0';        carry=ci/10;    }    if(carry==1) c=c+'1';    return rev(c);}string sub(string a,string b){    int lena=a.size();    int lenb=b.size();    if(lena<lenb||(lena==lenb&&a<b)) return "";    a=rev(a);    b=rev(b);    int carry=0;    string c;    int i;    for(i=0;i<lena&&i<lenb;i++)    {        int ai=a[i]-'0';        int bi=b[i]-'0';        int ci=ai-bi-carry;        if(ci<0)        {            ci+=10;            carry=1;        }        else carry=0;        c+=(ci%10)+'0';    }    for(;i<lena;i++)    {        int ai=a[i]-'0';        int ci=ai-carry;        if(ci<0)        {            ci+=10;            carry=1;        }        else carry=0;        c+=(ci%10)+'0';    }        int lenc=c.size();    for(i=c.size()-1;i>=0;i--)    {        if(c[i]=='0') lenc--;        else break;    }    if(lenc==0) return "";    c=c.substr(0,lenc);    return rev(c);}string divide(string a,string b){    int lena=a.size();    int lenb=b.size();        if(lena<lenb||(lena==lenb&&a<b))  return "0";    string bt[11];    bt[0]="";    bt[1]=b;    for(int j=2;j<=10;j++)//除法的条件限制每一位的商不可能>=10     {        bt[j]=add(bt[j-1],bt[1]);    }        int i=lenb-1;    string c;    string now=a.substr(0,lenb);    if(now<b)    {        now+=a[++i];//除法相当于多次减法,这样表示++i程序更快     }        for(;i<lena;i++)    {        int ci;        int len_now=now.size();                for(ci=1;ci<=10;ci++)        {            int lbn=bt[ci].size();            if(lbn>len_now||(lbn==len_now&&bt[ci]>now)) break;//除不下去了就跳出循环         }        ci--;//看有几个数能被减,因为ci时跳出循环,所以不算在内,需要减一         c+=ci+'0';        now=sub(now,bt[ci]);        if(i<lena-1)        {            if(now.size()==0&&a[i+1]=='0') continue;            now+=a[i+1];        }    }    return c;}int main(){    string a,b;    cin>>a>>b;    cout<<divide(a,b)<<endl;}


0 0
原创粉丝点击