【pat乙級】A除以B

(pat乙級1017)

本題要求計算 A/B,其中 A 是不超過 1000 位的正整數,B 是 1 位正整數。你需要輸出商數 Q 和餘數 R,使得 A=B×Q+R 成立。

輸入格式:
輸入在一行中依次給出 A 和 B,中間以 1 空格分隔。

輸出格式:
在一行中依次輸出 Q 和 R,中間以 1 空格分隔。

輸入樣例:
123456789050987654321 7

輸出樣例:
17636684150141093474 3

c++代碼:

#include<iostream> 
using namespace std;
int main(){
    string a;
    int b;
    cin>>a>>b;
    int l=a.length();
    int prenextnum=0,thisnum=a[0]-'0',index=0,flag0=0,flag_this=0; //flag0判斷是否第一位非0商已出現,從第一位非0商開始輸出
    if(l==1){
        int result=(a[0]-'0')/b;
        cout<<result<<" "<<a[0]-'0'-result;
    }
    for(int i=1;i<l;i++){
        if(thisnum>=b){  //當前thisnum夠除,改變下次的thisnum計算方式 
//            cout<<">=b    thisnum:"<<thisnum<<" ";
//            cout<<" 輸出:"; 
            int result=thisnum/b;
            if((flag0==1&&result==0)||result!=0)
            cout<<result;
            if(result!=0)flag0=1;
            prenextnum=thisnum-(thisnum/b)*b;
            thisnum=prenextnum; 
//            cout<<" thisnum變爲:"<<thisnum<<endl;
            flag_this=1;
        } 
        if(flag_this==1){  //當前thisnum>=b但還未加上當前a[i] 
            if(i!=l-1){
                thisnum*=10;
//                cout<<"flag_this=1  "<<"a["<<i<<"]:"<<a[i]-'0'<<endl;
                thisnum+=(a[i]-'0'); 
                if(thisnum<b)cout<<"0";
            }
            else{
//                cout<<" 輸出:"; 
                thisnum*=10; 
                thisnum+=(a[i]-'0'); 
                int result=thisnum/b;
                if((flag0==1&&result==0)||result!=0)
                cout<<result;
                if(result!=0)flag0=1;
                int yushu=thisnum-(thisnum/b)*b;
                cout<<" "<<thisnum-(thisnum/b)*b;
            }
        }
        else if(thisnum<b){  //還不夠除 
            if(i!=l-1){
//                cout<<"<b    thisnum:"<<thisnum<<" ";
                thisnum*=10; 
                thisnum+=(a[i]-'0'); 
                if(thisnum<b&&flag0==1)cout<<"0";
//                cout<<" thisnum變爲:"<<thisnum<<endl;
                flag_this==0;
            } 
            else{
//                cout<<" 輸出:"; 
                thisnum*=10; 
                thisnum+=(a[i]-'0'); 
                int result=thisnum/b;
                if((flag0==1&&result==0)||result!=0)
                cout<<result;
                if(result!=0)flag0=1;
                int yushu=thisnum-(thisnum/b)*b;
                cout<<" "<<thisnum-(thisnum/b)*b;
            }
        } 
    } 

    return 0; 
}

//測試樣例:123456789050987654321 7 

注意:
1.餘數爲0時仍要輸出餘數
2.輸出商時,從第一位非0商開始輸出

此題限制了除數b只爲一位正整數,降低了難度,升級版爲大整數除法
思路是先手寫樣例中兩個數的除法,把大數a當做字符串for循環遍歷a的每一位,for循環中每一步按照手寫時的操作來,模擬手寫。

代碼中有註釋掉的調試信息,打印調試信息觀察計算過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章