PAT+1017+A除以B

  1. A除以B (20)

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

輸入格式:

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

輸出格式:

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

123456789050987654321 7

輸出樣例:

17636684150141093474 3

百度到兩種解法,一個滿分,一個部分正確,大家一起來看一看有什麼問題。
1.這個是部分正確,得分18分

#include <iostream>

#include <string>

using namespace std;

int main(void)
{
    string A;
    int B;
    string res;
    // Q除數  R餘數  divior商
    int Q, R = 0, divior;

    cin>>A>>B;

    for(int i = 0; i < A.size(); ++i)
    {
        Q = 10 * R + A[i] - '0';    
        divior = Q / B;
        R = Q % B;    

        if(!res.empty() || divior != 0) //res不爲空,或者商不等於0 
        {
            res.push_back(divior + '0');
        }

    }
    cout<<res<<" "<<R<<endl;

    return 0;
}

2.這個是20分滿分

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string A;//表示被除數 
    int B;//表示除數 
    int temp = 0, p = 0;
    cin >> A >> B;
    for (int i=0; i<A.length(); i++ )
    {
        temp = temp*10 + A[i] - '0';//每次用temp除以B,下一循環自動更新temp的值 
        if ( temp >= B )//判斷是否大於除數B ,成立則輸出商的第一位 
        {
            cout << temp/B;
            p = 1;//第一位輸出後用p標記 
        }
        else if (p)
        { 
            cout << "0";//第一位輸出後且temp<B,則後移一位,商0 
        }                                                                                             
        temp %= B;//得到餘數 
    }
    if ( p == 0 )
        cout << "0";
    cout << " " << temp << endl;

    return 0;
}

這兩種解法我都學習到很多,此題的因爲被除數範圍太大,所以用字符串表示被除數,按照小學學過的基本除法規則的思路進行計算。但是我不知道第一種解法得18分問題出在哪裏了。

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