题目如下:
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
解决方案:
1.思路:本题是标准的大整数除法运算,思路也很简单,使用字符串存储输入的数字,然后利用大整数除法运算的方法解题即可。
2.大整数除法竖式运算:大整数除法运算的思路仍然从《算法笔记》中所学,在此复述一遍,就当巩固所学:以样例输入的前7位"1234567"和除数"7"为例:
我们在进行除法运算时打竖式的思路时这样的:
- 1 < 7,不够除,该位商为0,余数为1。
- 1中的余数1与他的下一位2组成新的数12,12 > 7,够除,该位商为1,余数为5。
- 2中的余数5与他的下一位3组成新的数53,53 > 7,够除,该位商为7,余数为4。
- 3中的余数4与他的下一位4组成新的数44,44 > 7,够除,该位商为6,余数为2。
- 4中的余数2与他的下一位5组成新的数25,25 > 7,够除,该位商为3,余数为4。
- 5中的余数4与他的下一位6组成新的数46,46 > 7,够除,该位商为6,余数为4。
- 6中的余数4与他的下一位7组成新的数47,47 > 7,够除,该位商为6,余数为5
大整数除法运算的思路即是模仿该竖式运算思路而完成的,这部分代码如下:
//str为输入的大整数
//首先需要一个数组来存储最后的商,还有一个变量来存储余数:
vector<int> Mer; //商
int Rem = 0; //余数
for(int i = 0; i < str.length(); i++) {
Rem = Rem * 10 + str[i] - '0'; //首先将当前位的数字和上一位遗留的余数组合
if(Rem < Div) Mer.push_back(0); //判断当前位是否够除,若不够除,该位为0
else {
Mer.push_back(Rem / Div); //若够除,就拿新组成的数除以除数每一次得到的商
Rem = Rem % Div; //获得新的余数
}
}
有了以上思路,将代码补全完整即可完成这道题目,需要注意的是,在最后输出商的时候,需要去掉首位的"0",而且还有一种可能——得到的商就是0。
完整代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string str;
vector<int> Mer; //商
int Rem = 0;
int Div; //除数
cin >> str >> Div;
for(int i = 0; i < str.length(); i++) {
Rem = Rem * 10 + str[i] - '0';
if(Rem < Div) Mer.push_back(0);
else {
Mer.push_back(Rem / Div);
Rem = Rem % Div;
}
}
if(Mer[0] == 0 && Mer.size() != 1) Mer.erase(Mer.begin()); //第一个条件是为了去掉首位的0,第二个条件是防止商为0.
for(int i = 0; i < Mer.size(); i++) {
cout << Mer[i];
}
cout << " " << Rem;
}