- 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分問題出在哪裏了。