- 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分问题出在哪里了。