zoukankan      html  css  js  c++  java
  • 1308:【例1.5】高精除

    传送门:http://ybt.ssoier.cn:8088/problem_show.php?pid=1308

    【题目描述】

    高精除以高精,求它们的商和余数。

    【输入】

    输入两个低于300位的正整数。

    【输出】

    输出商和余数。

    【输入样例】

    1231312318457577687897987642324567864324567876543245671425346756786867867867
    1231312318767141738178325678412414124141425346756786867867867

    【输出样例】

    999999999748590
    179780909068307566598992807564736854549985603543237528310337



    被除数若为9位,除数为6位,那么把除数加两位进行高精度减法,每件一次商加上100(0的个数为被除数位减去除数位数-1)即可。

    例子:
    9745 / 3

    第一次 9745 300 减32次,余145 商 32*100
    第二次 145 30 减4次,余25 商 32*100+4*10
    第三次 25 3 减8次,余1 商 32*100+4*10+8*1







    code:




    #include<iostream>
    #include<cstring>
    #define N 310
    using namespace std;
    string a,b;
    int as[310],bs[310],ans[310],lena,lenb;
    void jian(){
        for(int i=0;i<lena;i++)as[i]-=bs[i];
        for(int i=0;i<lena;i++)
        {
            if(as[i]<0){
                as[i]+=10;
                as[i+1]--;
            }
        }
        while(as[lena-1]==0&&lena>0)lena--;
    }
    bool dx(){
        if(lena>lenb)return true;
        if(lena<lenb)return false;
        for(int i=lena-1;i>=0;i--){
            if(as[i]>bs[i])return true;
            if(as[i]<bs[i])return false;
        }
        return true;
    }
    void jy(int k)
    {
        if(k==0)k=1;
        if(k!=1)
        {
            for(int i=lenb-1;i>=0;i--)
            {   
                bs[i+k-1]=bs[i];
                bs[i]=0;
            }
            lenb+=k-1;
        }
        while(dx()==true){
            jian();
            ans[k-1]++;
            int ls=k-1;
            for(int i=k-1;i<=ls;i++)
            {
                if(ans[i]>9){
                    ans[i+1]++;
                    ans[i]-=10;
                    if(ans[i+1]>9)ls++;
                }
            }
        }
        if(k!=1)
        {
            for(int i=k-1;i<lenb;i++)
            {
                bs[i-k+1]=bs[i];
                bs[i]=0;
            }
            lenb-=k-1;
        }
    }
    int main(){
        cin>>a>>b;
        if(a==b){cout<<1<<endl<<0<<endl;return 0;}
        lena=a.size();
        lenb=b.size();
        for(int i=0;i<lena;i++)as[i]=a[lena-i-1]-'0';
        for(int i=0;i<lenb;i++)bs[i]=b[lenb-i-1]-'0';
        memset(ans,0,sizeof(ans));
        int k=lena-lenb;
        if(k<0){cout<<0<<endl<<a<<endl;return 0;}
        while(k>=0){
            if(k==0&&dx()==false)break;
            jy(k);
            k=lena-lenb;
        }
        int h1=301,h2=301;
        while(ans[h1]==0&&h1>0)h1--;
        while(as[h2]==0&&h2>0)h2--;
        for(int i=h1;i>=0;i--)cout<<ans[i];
        cout<<endl;
        for(int i=h2;i>=0;i--)cout<<as[i];
        cout<<endl;
    }

    第一次写博客

    这题没看大佬的

    更优的做法实在想不到了

  • 相关阅读:
    Visual Studio 存在版本之间冲突
    Failed to load resoure:the serve responded with a status of 405 (Method Not Allowed)
    Excel 导入解析数据 NPOIExcelHelper
    WIN10 SERVICES -- 部署IIS
    高德地图API-搜索提示并定位到位置,卫星地图和标准地图的切换
    BIMFCE选择全量绘制
    JS中如何获取当前日期,并与输入日期作比较
    html中input标签放入小图标
    div跟随浏览器大小而改变
    vue-amap接入高德地图示例
  • 原文地址:https://www.cnblogs.com/jzxnl/p/11029124.html
Copyright © 2011-2022 走看看