高精度除法

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

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值