我是靠谱客的博主 幽默板凳,最近开发中收集的这篇文章主要介绍PAT乙级练习题1017 A除以B,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:

本题要求计算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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部