PTA 1017 A除以B(20 分)

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

从这道题学到的东西
1.很大的数进行除法的方法。

没有其他的了.

方法:
1.先将被除数的第n位取出来,判断第n位是否比除数大,如果不如除数大就把第n位乘10加上第n+1位。(n从1开始)
2.重复1中的操作直达取到第m位时,这个数大于除数。
3.用这个数除以除数,将得到的商和余数分开保存。(每次得到的商按顺序存在数组中)
4.判断刚刚取到的第m位是否为最后一位,如果是则输出商和余数。
5.如果不是则将余数*10加上m+1位。
6.用这个数除以除数,将得到的商和余数分开保存。直到取到最后一位为止。(每次得到的商按顺序存在数组中)
7.输出结果。

#include
#include
using namespace std;


int main()
{
	string dividend;		//被除数
	int divisor;			//除数
	int quotient[1000];			//商
	int remainder;			//余数
	int temp_remainder;		//临时存放被余数
	int k = -1;					//记录第一个不为0的数的位置	
	int q = 0;					//作为商的下标

	cin >> dividend;
	cin >> divisor;
		
	for (int i = 0; i < dividend.length(); i++)		//处理掉前导为0的情况
	{
		if (dividend[i] - '0' != 0)
		{
			k = i;
			break;
		}
	}
	
	if ((dividend[k] - '0') < divisor && k == dividend.length() - 1)		//如果是一位数,并且小于除数的情况
	{
		cout << "0" << ' ' << dividend[k] - '0';
		return 0;
	}

	temp_remainder = dividend[k] - '0';			// 上述方法中的1 2步
	while (temp_remainder < divisor)
	{
		temp_remainder = temp_remainder * 10 + (dividend[++k] - '0');
	}

	quotient[q++] = temp_remainder / divisor;		//上述方法中的第3步
	remainder = temp_remainder % divisor;

	temp_remainder = remainder;
		
	while (++k < dividend.length())			//上述方法中的4 5 6步
	{	
		temp_remainder = temp_remainder * 10 + (dividend[k] - '0');
		quotient[q++] = temp_remainder / divisor;
		remainder = temp_remainder % divisor;
		temp_remainder = remainder;
	}

	for (int i = 0; i < q; i++)		//上述方法中的第7步
	{
		cout << quotient[i];
	}
	cout << ' ' << remainder;

	return 0;
}

你可能感兴趣的:(PTA 1017 A除以B(20 分))