计算器
2026-08-28 10:15:57
发布于:广东
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int cmpAbs(const vector<int>& A, const vector<int>& B) {
if (A.size() != B.size()) return A.size() > B.size() ? 1 : -1;
for (int i = A.size() - 1; i >= 0; --i) {
if (A[i] != B[i]) return A[i] > B[i] ? 1 : -1;
}
return 0;
}
vector<int> add(const vector<int>& A, const vector<int>& B) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || i < B.size() || t; ++i) {
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
return C;
}
vector<int> sub(const vector<int>& A, const 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 = (t < 0) ? 1 : 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
vector<int> mul(const vector<int>& A, const vector<int>& B) {
vector<int> C(A.size() + B.size(), 0);
for (int i = 0; i < A.size(); ++i)
for (int j = 0; j < B.size(); ++j)
C[i + j] += A[i] * B[j];
int t = 0;
for (int i = 0; i < C.size(); ++i) {
t += C[i];
C[i] = t % 10;
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
bool greaterOrEqual(const vector<int>& A, const 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;
}
vector<int> divBig(const vector<int>& A, const vector<int>& B) {
if (cmpAbs(A, B) < 0) return {0};
vector<int> C;
vector<int> R;
C.resize(A.size(), 0);
for (int i = A.size() - 1; i >= 0; --i) {
R.insert(R.begin(), A[i]);
while (R.size() > 1 && R.back() == 0) R.pop_back();
int l = 0, r = 9, q = 0;
while (l <= r) {
int mid = (l + r) / 2;
vector<int> B_mid;
if (mid == 0) B_mid = {0};
else {
B_mid = mul(B, {mid});
}
if (greaterOrEqual(R, B_mid)) {
q = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
C[i] = q;
if (q > 0) {
vector<int> product = mul(B, {q});
R = sub(R, product);
}
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
vector<int> trans(const string& s) {
vector<int> res;
if (s.empty()) return {0};
for (int i = s.size() - 1; i >= 0; --i) {
res.push_back(s[i] - '0');
}
while (res.size() > 1 && res.back() == 0) res.pop_back();
return res;
}
void output(const vector<int>& A, bool neg = false) {
if (neg) cout << "-";
for (int i = A.size() - 1; i >= 0; --i) cout << A[i];
cout << endl;
}
int main() {
cout << "**********计算器***********" << endl;
string s;
while (cin >> s) {
if (s == "stop") break;
int pos = -1;
char op = 0;
for (int i = 1; i < s.size(); ++i) {
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
pos = i;
op = s[i];
break;
}
}
if (pos == -1) continue;
string s1 = s.substr(0, pos);
string s2 = s.substr(pos + 1);
bool f1 = false, f2 = false;
if (!s1.empty() && s1[0] == '-') {
f1 = true;
s1 = s1.substr(1);
}
if (!s2.empty() && s2[0] == '-') {
f2 = true;
s2 = s2.substr(1);
}
vector<int> A = trans(s1);
vector<int> B = trans(s2);
if (A.size() == 1 && A[0] == 0) f1 = false;
if (B.size() == 1 && B[0] == 0) f2 = false;
vector<int> res;
bool resNeg = false;
if (op == '+') {
if (f1 == f2) {
res = add(A, B);
resNeg = f1;
} else {
int c = cmpAbs(A, B);
if (c == 0) {
res = {0};
resNeg = false;
} else if (c > 0) {
res = sub(A, B);
resNeg = f1;
} else {
res = sub(B, A);
resNeg = f2;
}
}
} else if (op == '-') {
if (f1 != f2) {
res = add(A, B);
resNeg = f1;
} else {
int c = cmpAbs(A, B);
if (c == 0) {
res = {0};
resNeg = false;
} else if (c > 0) {
res = sub(A, B);
resNeg = f1;
} else {
res = sub(B, A);
resNeg = !f1;
}
}
} else if (op == '*') {
if ((A.size() == 1 && A[0] == 0) || (B.size() == 1 && B[0] == 0)) {
res = {0};
resNeg = false;
} else {
res = mul(A, B);
resNeg = (f1 != f2);
}
} else if (op == '/') {
if (B.size() == 1 && B[0] == 0) {
res = {0};
resNeg = false;
} else if (A.size() == 1 && A[0] == 0) {
res = {0};
resNeg = false;
} else {
res = divBig(A, B);
resNeg = (f1 != f2);
if (res.size() == 1 && res[0] == 0) resNeg = false;
}
}
output(res, resNeg);
}
return 0;
}
这里空空如也



















有帮助,赞一个