wikioi天梯之3118 高精度练习之除法

题目

做了天梯的加减乘然后又把除法找出来做了下 利用减法做除法 所以先要保证减法写的是对的 这次直接写减法 比上次速度提高了 而且竟然一次写对了。

之前做过加减乘除 除法就没有参考资料了 自己独立写的 最终也写出来了。 

#include <iostream>
#include <string>
#include<algorithm>
#include<cstring>

using namespace std;

string sub(const string &a_, const string &b_)
{
    int *tem;
    char *re;
    string result,a,b;
    bool flag = true;
    unsigned i,j;
    if(a_ == b_)return "0";
    a = a_;
    b=b_;
    if(a.length() < b.length())flag = false,swap(a,b);
    else if(a.length() == b.length() && a < b)flag = false,swap(a,b);

    tem = new int[a.length()];
    re = new char[a.length() + 2];

    memset(tem,0,(a.length()) * sizeof(int));
    memset(re,'\0',(a.length() + 2) * sizeof(char));

    for(i = 0,j = 0; i < a.length(); ++i)
    {
        if(i < a.length() - b.length())tem[i] = a[i] -'0';
        else
        {
            tem[i] = a[i] - b[j];
            ++j;
        }
    }

    for(i = a.length() - 1; i > 0; --i)
    {
        if(tem[i] < 0)
        {
            tem[i-1] -= 1;
            tem[i] += 10;
        }
    }
    j = 0;
    while(tem[j] == 0)++j;
    if(flag)
    {
        for(i = j; i < a.length(); ++i)re[i-j] =tem[i] + '0';
        re[i-j] = '\0';

    }
    else
    {
        re[0] = '-';
        for(i = j; i < a.length(); ++i)re[i-j+1] = tem[i] + '0';
        re[i-j+1] = '\0';
    }
    result = re;
    delete []re;
    delete []tem;
    return result;
}

string div(const string &a_, const string &b_)
{
    if(a_ == b_)return "1";
    else if(a_.length() == b_.length() && a_ < b_)return "0";
    else if(a_.length() < b_.length())return "0";
    else if(b_ == "1")return "a_";
    else if(b_ == "0")return "error!";

    char *re;
    string result,a,b;
    a = a_;
    b = b_;
    re = new char[a.length() - b.length() + 2];

    memset(re,'\0',(a.length() - b.length() + 2) * sizeof(char));

    int sub_len = a.length() - b.length();
    int i,j = 0,re_tem = -1;
    string test,a_tem;

    while(1)
    {
        b = b_;
        for(i = 0; i < sub_len; i++)b += "0";
        //cout<<b<<endl;

        while(1)
        {
            a_tem = a;
            // cout<<"a0 = "<<a<<endl;
            a = sub(a,b);
           // cout<<"a = "<<a<<endl;
            ++re_tem;
            if(a[0] == '-')
            {
                re[j] =re_tem + '0';
                ++j;
                re_tem = -1;
                --sub_len;
                a = a_tem;
                //cout<<"a2 = "<<a<<endl;
                break;
            }
        }
        test = sub(a,b_);
        if(test[0] == '-' || a == "0")break;

    }
    re[j] = '\0';
    unsigned m,k = 0;
    while(re[k] == '0')++k;//写成re[k] == 0 检查半天才发现。。
    for(m = k;m < a_.length() - b_.length() + 2;++m) re[m-k] = re[m];
    //这里写成m < a.length() - b.length() + 2 也检查了半天 囧

    result = re;
    delete []re;
    return result;
}


int main()
{
    string a,b;
    cin>>a>>b;
    cout<<div(a,b);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值