PAT乙级1017 || A除以B(C/C++)


【欢迎关注微信公众号:计算机黑科学大全,在对话框回复:PAT乙级真题】获取全部真题详解及代码示例

A除以B

题目描述:

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

输入格式:

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

输出格式:

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

输入样例:

123456789050987654321 7

输出样例:

17636684150141093474 3

题目来源:PAT乙级1017
作者:CHEN, Yue
单位:浙江大学

问题解决:

解题思想

此题主要需解决一下几个问题:

  • 大数的存储和输入问题。
  • 大数除以一位正整数的具体实施过程
  • 执行除法的过程中特殊情况的处理

由于A 是不超过 1000 位的正整数,因此只能用数组来存储A的每一位数字,因为要将大数的每一位存入数组的每一个元素,因此,我们用字符数组接收输入更方便。当遇到空格时即为大数输入结束。接下来用c来逐步实现大数的除法。c先初始化为0,然后将大数从最高位到最低位逐步赋给c,当c除以b有余数时,余数作为c下一次的十位,大数的下一位作为c下一次的个位,除第一位和最后一位外,其它余数为0且下一位小于除数b时商均需补0(此除法过程就是模拟笔算除法的过程,相应的细节可模拟笔算除法理解)。

除了上面除第一位和最后一位外,其它余数为0且下一位小于除数b时商均需补0这一特殊情况外,还应注意以下两个特殊情况:

  • 测试用例的输入中有大数的最高几位均为0的情况(例如00012345),c被赋值这几位时是不能有输出的,我们用flag来控制即可。
  • 测试用例的输入中有a小于b的情况,此时退出for循环后是没有输出的(此时退出for循环后flag为0),在for循环外需要作额外处理(输出0)。

知识拓展

我们知道在C语言中,所有变量的定义和声明都必须在函数的开头处,而且变量定义和声明的前面不能有任何其它非声明定义的语句。而在C++中,就没有这么严格的规定了,只要在用到变量前对该变量进行定义和声明就可以,定义和声明的位置是比较灵活的(比如下面代码定义变量的位置)。

代码示例(C/C++)

小提示:请将以下代码保存为.cpp格式(C++程序)左右滑动代码可查看全部内容

#include 
#define MAXN 1001
using namespace std;
int main()
{
     
    char a[MAXN];//用字符数组来存输入的大数
    int i = 0;
    //输入大数
    do{
     
        a[i] = getchar();
        i++;
    }while(a[i-1] != ' ');//遇到空格时大数输入结束,
    int b;                //由于输入之后i自增了1,因此判断时i需减1
    scanf("%d",&b);//输入除数
    int c = 0;//c存当前处理的大数的部分
    int flag = 0;
    for(i = 0; a[i] != ' '; i++){
     
        c += a[i] - '0';
        if(c >= b){
     
            printf("%d",c / b);
            c %= b;
            flag = 1;
        }
        if(c == 0&&a[i+1] != ' '&&(a[i+1] - '0') < b&&flag){
     
            printf("0");//除第一位和最后一位外,其它余数为0
        }               //且下一位小于除数b时均需补0
        c *= 10;
    }
    if(!flag){
     //如果大数小于b即flag为0也就是上面的for循环没有输出,则在此处输出0
        printf("0");
    }
    int q;
    q = c / 10;//循环退出时,余数多乘了10
    printf(" %d\n",q);
    return 0;
}

1.png

你可能感兴趣的:(PAT乙级真题详解,PAT算法)