概述
题目:
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
思路:
A最高位可以有1000位,常见的数据类型都存储不下,因此不能用两个数字直接相除的方法获得商和余数。
需要用除法求商过程来逐步求出商和余数:
比如 100/2 ,从第一位的1开始,计算1/2,得商为0,余数为1,在第一位非零商输出前,商为0的情况不能输出。
然后余数和下一位0 ,组合为1*10+0=10,就变成10/2 商为5余数为0,此时输出商数。
然后0和最后一位0,组合为0*10+0=0,0/2余数为0,被除数所有位数组合完,此时运算完毕。
进行除法的竖式计算就能理解上述过程了。
注意:
参考了其他解析,可能要讨论A和B是否为0的情况,但题目说了B是正整数,所以B就没有0的情况了。如果A为0,那么就是A<B的情况,商和余数都是0,也不用额外判断了。
代码:
#include <iostream>
using namespace std;
int main(){
string A;//被除数
int B;//除数
int R = 0;//余数
int n = 0;//记录被除数的各个位上的数值
cin >> A >> B;
int flag = 0;
for(int i = 0; i < A.length(); ++i){
//从被除数的第一位开始,将被除数逐位和余数组合成新的被除数
n = A[i] - '0';
R = n + R;
if(R >= B){
//商逐位输出
cout << R/B;
flag = 1;
}
else{
//这是被除数不够除的情况,商为零,但只有当第一位非零商输出后,后续的位的商才会输出0
if(flag){
cout << 0;
}
}
//余数向前进位
R = R%B*10;
}
//如果flag为0,说明被除数小于除数,前面运算中被除数的每一位和余数结合后都不够除,最后商为0
if(flag == 0){
cout << 0;
}
//由于前面运算最后一步余数向前进位了,需要回退一位才是正确的余数
cout << " " << R/10;
return 0;
}
参考的解析
PAT(BasicLevel):A除以B (20)
这个解析第二个测试点没过,没有考虑A<B的情况,结果商没有输出,我用flag判断了这种情况
最后
以上就是幽默板凳为你收集整理的PAT乙级练习题1017 A除以B的全部内容,希望文章能够帮你解决PAT乙级练习题1017 A除以B所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复