我是靠谱客的博主 幽默板凳,这篇文章主要介绍PAT乙级练习题1017 A除以B,现在分享给大家,希望可以做个参考。

题目:

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式:

输入在一行中依次给出 A 和 B,中间以 1 空格分隔。

输出格式:

在一行中依次输出 Q 和 R,中间以 1 空格分隔。

输入样例:

复制代码
1
2
123456789050987654321 7

输出样例:

复制代码
1
2
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,也不用额外判断了。

代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(106)

评论列表共有 0 条评论

立即
投稿
返回
顶部