文章目录
一【题目难度】
- 乙级
二【题目编号】
- 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;
}