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

第一次寫博客

這題沒看大佬的

更優的做法實在想不到了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM