本题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805305181847552
1017 A除以B(20 分)
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
分析:
此题是典型的竖式除法题,根据竖式除法思想,假设被除数为A,余数为R,除数为B,商为Q,则R初始化为A第1位,不断使A的各个位依次成为R的末位直到R不小于B,保留商,R通过模除数B得到新余数,才开始真正的除法运算。运算时,R先增加末位,Q再保留商,R再更新,如此循环直至运算进行至A末尾。至此,你还需要注意题目的两个卡点:
1.除数B小于A的第1位的情况
2.被除数A会存在前导0的情况,此卡点是本题最坑的点
结合上述卡点,则可以先遍历串,标记第1个数字不为0的位置,余数R得到该数字值,如果R大于B且该位置是A的最后1位即A表示1位数字且大于B,则可先输出0和R,否则在R的基础上进行运算。
代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string A;
int B,Q[1000],R,i,j=0;
cin>>A>>B;
for(int k=0;k<A.length();k++)
if(A[k]-'0'!=0)//找到不为前导0的数字的位置
{
i=k;
break;
}
R=A[i]-'0';
if(R<B&&i==A.length()-1)//如果该数字小于除数且A表示一位数
{
cout<<"0 "<<R;
return 0;
}
while(R<B)
R=R*10+(A[++i]-'0');//余数不断增加末位直到不小于除数
Q[j++]=R/B;//存商
R%=B;//存余
while(++i<A.length())//如果没到串末尾
{
R=R*10+(A[i]-'0');//余数不断增加末位
Q[j++]=R/B;
R%=B;
}
for(i=0;i<j;i++)
cout<<Q[i];
cout<<' '<<R;
return 0;
}