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;
}