PAT Basic 1017. A除以B

PAT Basic 1017. A除以B

1. 题目描述:

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

2. 输入格式:

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

3. 输出格式:

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

4. 输入样例:

123456789050987654321 7

5. 输出样例:

17636684150141093474 3

6. 性能要求:

Code Size Limit
16 KB
Time Limit
100 ms
Memory Limit
64 MB

思路:

回看的时候没想出来怎么做,不知道当时怎么写出来的233

这里按照我们手算商和余数的方法编写代码即可,主要是涉及到借位。因为题目描述指出\(A\)的位数不超过1000,所以这里用算数类型不太可行,仍然把其当作字符串处理,也方便对每一位进行遍历。这里我定义了大小1001的字符数组dividend用于存储\(A\)(末尾存空字符),然后因为\(B\)是1位正整数,最小为1,那么商最大就等于被除数,这里我又定义了大小1001的字符数组quotient用于存储商。

剩下的就是借位的问题了,\(A\)中首个数字是有可能小于\(B\)的,所以要加个判断,以防止商的首位是0。另外就是如果\(A\)本身就比\(B\)小,还要加个判断用于输出商为0(按照我一开始的写法,不加判断的话只会输出一个余数)。

My Code:

#include <stdio.h>

int main(void)
{
    char dividend[1001];
    int divisor = 0;
    char quotient[1001];
    int temp = 0, res = 0, i = 0, j = 0;
    
    scanf("%s%d", dividend, &divisor);
    
    for(i=0, j=0; dividend[i]!='\0'; i++,j++)
    {
        temp = (res*10 + (dividend[i]-'0')) / divisor;    
        res = (res*10 + (dividend[i]-'0')) % divisor;
        //res = (dividend[i]-'0') % divisor;
        
        quotient[j] = '0' + temp;
        
        if(!temp && !i) j--;
    }
    
    quotient[j] = '\0';
    
    if(!j) // the divisor is greater than dividend
        printf("0 %d", res);
    else
        printf("%s %d\n", quotient, res);
    
    return 0;
}
posted @ 2023-03-09 10:46  十豆加日月  阅读(12)  评论(0编辑  收藏  举报