算法原理:
- 这个算法求的是高精度整数除以低精度整数的商和余数
- 通过vector容器逆序存储被除数,逐位相加,用变量 r 存储余数,得到结果用vector容器存储并输出。
代码实现:
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> Div(vector<int> &A, int b, int &r); //声明除法函数
int main()
{
string a; //定义被除数a
int b, r = 0; //定义除数b和商r
vector<int> A;
cin >> a >> b; //输入被除数a和除数b
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //将被除数a存入vector容器A
vector<int> C = Div(A, b, r); //调用除法函数
for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]); //打印商
printf(" %d\n", r); //打印余数
return 0;
}
//定义除法函数
vector<int> Div(vector<int> &A, int b, int &r)
{
vector<int> C; //定义商
r = 0; //将余数置零
for (int i = A.size() - 1; i >= 0; i--) //从高位遍历A
{
r = r * 10 + A[i];
C.push_back(r / b); //每次存入r/b的值
r %= b; //将r置为r/b得到的商进入下一次循环
}
//调换C内的元素顺序,因为主函数中是逆序遍历,所以需要将商的高位放在后面,低位放在前面
reverse(C.begin(), C.end());
while(C.size() > 1 && C.back() == 0) C.pop_back(); //清除前导0
return C;
}
下面提供一种错误算法:
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> Div(vector<int> &A, int b, int &r);
int main()
{
string a;
int b, r = 0;
vector < int> A;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
vector<int> C = Div(A, b, r);
for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
printf(" %d\n", r);
return 0;
}
vector<int> Div(vector<int> &A, int b, int &r)
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i--)
{
r = r * 10 + A[i];
if (r / b) { C.push_back(r / b); r %= b; }
}
reverse(C.begin(), C.end());
if (C.size() == 0) C.push_back(0);
return C;
}
错误算法我乍一看没看出哪里有问题,但是在写这道题的时候出现了,当商函数使用后一种算法时会有一个测试点通不过,不知道是什么原因,现在还没找到
欢迎大家探讨
tips:
下面错误原因被我找到了,在这段代码的 if 语句中,我为了清除前导 0 才加入了这么一条语句,但是在计算过程中,商中间的 0 也被清除了,所以才会导致结果错误。
for (int i = A.size() - 1; i >= 0; i--)
{
r = r * 10 + A[i];
if (r / b) { C.push_back(r / b); r %= b; }
}