【PAT (Basic Level) Practice】——【大整数运算】1017 A除以B

文章目录

一【题目难度】

  • 乙级

二【题目编号】

  • 1017 A除以B (20 分)

三【题目描述】

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

四【题目示例】

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

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

  • 输入样例:
    123456789050987654321 7

  • 输出样例:
    17636684150141093474 3

五【解题思路】

  • 很明显这道题不能用普通的方法计算,因为没有哪个数据类型可以支持1000位的数字,所以这应该想让我们手动模拟除法和取模的运算,我们可以想象我们手动计算的时候,从最高位开始除以除数,如果够除就上商(输出)且将余数(模)扩大10倍继续运算,不够除就将余数(模)扩大10倍继续运算,那么我们程序也一样在模拟这个过程。其中需要注意的是,我们首先要把第一位先判断一下,否则如果第一位不够除会商0(输出0),这个格式不符合答案要求,所以先判断一下,只有A的长度为1(一次运算即可),或者用第一位算的商不为0(说明够除)并且长度大于1(有余数(模)),这个时候才输出,不够除的情况不输出,这样就避免了输出0而导致格式不正确,然后更新余数(模)按序运算即可

六【最终得分】

  • 20分

七【代码实现】

#include<stdio.h>
#include<string.h>
int main()
{
    char A[1001];
    int B,Q,R = 0;
    scanf("%s %d",A,&B);
    int len = strlen(A);
    Q = (A[0] - '0') / B;
    if(len == 1 || (Q != 0 && len > 1))
    {
        printf("%d",Q);
    }
    R = (A[0] - '0') % B;
    for(int i = 1;i<len;i++)
    {
        Q = ((R*10) + (A[i] - '0')) / B;
        printf("%d",Q);
        R = ((R*10) + (A[i] - '0')) % B;
    }
    printf(" %d",R);
    return 0;
}

八【提交结果】

【PAT (Basic Level) Practice】——【大整数运算】1017 A除以B

上一篇:印度*提出自研移动操作系统,以替代 iOS 和 Android


下一篇:‘keytool‘ 不是内部或外部命令,也不是可运行的程序