其实该题用高精度除低精度算法也能做
#include <bits/stdc++.h>
using namespace std;
void numpy(vector<int>&b,vector<int>&temp,int n) //把b向左移动n-1位到temp,n是当前商的位置(最低位视为C1),如商可分为C4C3C2C1,从左到右依次为高位,低位
{
for (int i = 0; i < n; i++) //因为商数组用vector,所以每次循环传入的就是n-1。
{
temp.push_back(0);
}
for (int i = 0; i < b.size(); i++)
{
temp.push_back(b[i]);
}
}
vector<int>jianfa(vector<int>& a, vector<int>& b) //高精度减法
{
vector<int>c;
int t = 0;
for (int i = 0; i <a.size(); i++)
{
t = a[i] - t;
if (i < b.size())t -= b[i];
c.push_back((t + 10) % 10); //同时考虑t>0与t<0的情况
if (t < 0)t = 1; //借位
else t = 0; //不用借位
}
while (c.size() > 1 && c.back() == 0)c.pop_back(); //从高位去前导零
return c;
}
bool compare(vector<int>a, vector<int>temp)
{
if (a.size() != temp.size()) return a.size()>temp.size(); //如果长度不一样
else { //如果长度一样,从最高位开始比较
for (int i = a.size() - 1; i >= 0; i--)
{
if (a[i] != temp[i]) return a[i] > temp[i];
}
}
return true; //如果都一样长,返回1
}
void chufa(vector<int>& a, vector<int>& b)
{
vector<int>d(a.size() - b.size() + 1, 0); //商数组d的最大长度是两个数长度之差再加1;
for (int i = d.size() - 1; i >= 0; i--) //从最高位开始
{
vector<int>temp; //b移位后的临时数组
numpy(b, temp, i); //把b向左移动n-1位到temp,n是当前商的位置(最低位视为C1),如商可分为C4C3C2C1,从左到右依次为高位,低位
while (compare(a, temp)) //如果a>=temp
{
d[i]++;
a=jianfa(a, temp); //两数组相减
}
}
while (d.size() > 1 && d.back() == 0)d.pop_back(); //去除前导0,该d数组是商的低位到高位,不用翻转
for (int i = d.size() - 1; i >= 0; i--) cout << d[i]; //输出高精度的商
//若要输出余数,则可以遍历循环a即可,因为a逐渐减去后剩下余数了
}
int main()
{
string a, b;
cin >> a>>b;
vector<int>A, B;
for (int i = a.size() - 1; i >= 0; i--)A.push_back(a[i] - 48);
for (int i = b.size() - 1; i >= 0; i--)B.push_back(b[i] - 48);
if (a.size() < b.size())
{
cout << 0 << endl; //如果a<b,则商为0。
return 0;
}
chufa(A, B);//函数应用于a>b的情况或a和b长度一样的情况
return 0;
}