我看高精度+,-,*已经够多了,安排一个a/b
高精度/低精度
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 高精度除以低精度,返回商(也是高精度),余数通过引用返回
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];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main() {
string a;
int b;
cin >> a >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
int r;
vector<int> C = div(A, b, r);
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl <<r<< endl;
return 0;
//r是余数
}
高精度/高精度
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 比较两个数的大小,A和B是倒序存储(低位在前)
bool cmp(vector<int> &A, vector<int> &B) {
if (A.size() != B.size()) return A.size() > B.size();
for (int i = A.size() - 1; i >= 0; i--) {
if (A[i] != B[i]) return A[i] > B[i];
}
return true; // 相等
}
// 高精度减法,要求A>=B
vector<int> sub(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);
if (t < 0) t = 1;
else t = 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
// 高精度除法(高精/高精),返回商和余数
vector<int> div(vector<int> &A, vector<int> &B, vector<int> &r) {
vector<int> C; // 商
r.clear(); // 余数
// 如果A<B,则商为0,余数为A
if (!cmp(A, B)) {
C.push_back(0);
r = A;
return C;
}
// 将除数B调整为与被除数A相同的位数(倒序存储,所以从高位到低位是A和B的末尾)
vector<int> temp;
int cnt = A.size() - B.size(); // 最多左移的位数
for (int i = 0; i < cnt; i++) {
B.insert(B.begin(), 0);
}
// 从高位到低位(在倒序存储中,高位在末尾)开始试商
for (int i = 0; i <= cnt; i++) {
int quotient = 0;
// 用减法试商,直到当前被除数小于除数
while (cmp(A, B)) {
vector<int> S = sub(A, B);
A = S;
quotient++;
}
C.push_back(quotient);
// 除数右移一位(即去掉最后面的0,因为倒序存储,最后面是高位)
B.erase(B.begin());
}
reverse(C.begin(), C.end()); // 因为商是高位先算出来的,但存储时是低位在前,所以反转
while (C.size() > 1 && C.back() == 0) C.pop_back();
r = A; // 余数
return C;
}
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] - '0');
for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
vector<int> r;
vector<int> C = div(A, B, r);
// 输出商
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl;
// 输出余数
for (int i = r.size() - 1; i >= 0; i--) cout << r[i];
cout << endl;
return 0;
}
于行衍在2025-07-07 21:56:27追加了内容
这里的除法只是高精度/低精度
https://wenda.codingtang.com/questions/28995/
注:高精度指long long,低精度反之
于行衍在2025-07-07 21:58:04追加了内容
余数部分不想要就删了
1:删除输出r,2。删除最后一个循环
于行衍在2025-07-08 14:45:04追加了内容
丁