1017 A除以B(20 分)竖式除法与卡点分析

本题链接: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;
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/81673910