普解+高精度 题解 100% AC
2025-08-27 22:31:28
发布于:江苏
12阅读
0回复
0点赞
真没人用高精度吗?
1. 高精度
#include <bits/stdc++.h>
using namespace std;
struct BigInt {
string num;
bool isNeg;
BigInt(string s = "0") {
if(s[0] == '-') {
isNeg = true;
num = s.substr(1);
} else {
isNeg = false;
num = s;
}
num = removeLeadingZeros(num);
if(num == "0") isNeg = false;
}
string toString() const {
return (isNeg ? "-" : "") + num;
}
static string removeLeadingZeros(string s) {
int i = 0;
while(i < s.size()-1 && s[i] == '0') i++;
return s.substr(i);
}
};
int compare(string a, string b) {
a = BigInt::removeLeadingZeros(a);
b = BigInt::removeLeadingZeros(b);
if(a.size() != b.size())
return a.size() > b.size() ? 1 : -1;
return a.compare(b);
}
string add(string a, string b) {
string res;
int carry = 0;
int i = a.size()-1, j = b.size()-1;
while(i >= 0 || j >= 0 || carry) {
int sum = carry;
if(i >= 0) sum += a[i--]-'0';
if(j >= 0) sum += b[j--]-'0';
carry = sum / 10;
res += (sum % 10) + '0';
}
reverse(res.begin(), res.end());
return BigInt::removeLeadingZeros(res);
}
string sub(string a, string b) {
string res;
int borrow = 0;
int i = a.size()-1, j = b.size()-1;
while(i >= 0) {
int x = a[i--]-'0' - borrow;
int y = j >= 0 ? b[j--]-'0' : 0;
borrow = 0;
if(x < y) {
x += 10;
borrow = 1;
}
res += (x - y) + '0';
}
reverse(res.begin(), res.end());
return BigInt::removeLeadingZeros(res);
}
string mul(string a, string b) {
if(a == "0" || b == "0") return "0";
int m = a.size(), n = b.size();
vector<int> res(m+n, 0);
for(int i = m-1; i >= 0; i--) {
for(int j = n-1; j >= 0; j--) {
int product = (a[i]-'0') * (b[j]-'0');
int sum = product + res[i+j+1];
res[i+j+1] = sum % 10;
res[i+j] += sum / 10;
}
}
string ans;
for(int num : res) {
if(!ans.empty() || num != 0) {
ans += to_string(num);
}
}
return ans;
}
pair<string, string> divide(string a, string b) {
if(b == "0") return {"0", "0"};
string quotient;
string remainder;
for(int i = 0; i < a.size(); i++) {
remainder += a[i];
remainder = BigInt::removeLeadingZeros(remainder);
int count = 0;
while(compare(remainder, b) >= 0) {
remainder = sub(remainder, b);
count++;
}
quotient += to_string(count);
}
quotient = BigInt::removeLeadingZeros(quotient);
remainder = BigInt::removeLeadingZeros(remainder);
if(quotient.empty()) quotient = "0";
if(remainder.empty()) remainder = "0";
return {quotient, remainder};
}
void solve(BigInt A, BigInt B) {
string sum;
if(A.isNeg == B.isNeg) {
sum = add(A.num, B.num);
if(A.isNeg) sum = "-" + sum;
} else {
int cmp = compare(A.num, B.num);
if(cmp == 1) {
sum = sub(A.num, B.num);
if(A.isNeg && sum != "0") sum = "-" + sum;
} else if(cmp == -1) {
sum = sub(B.num, A.num);
if(B.isNeg && sum != "0") sum = "-" + sum;
} else {
sum = "0";
}
}
cout << sum << endl;
string diff;
if(A.isNeg != B.isNeg) {
diff = add(A.num, B.num);
if(A.isNeg) diff = "-" + diff;
} else {
int cmp = compare(A.num, B.num);
if(cmp == 1) {
diff = sub(A.num, B.num);
if(A.isNeg && diff != "0") diff = "-" + diff;
} else if(cmp == -1) {
diff = sub(B.num, A.num);
if(!A.isNeg && diff != "0") diff = "-" + diff;
} else {
diff = "0";
}
}
cout << diff << endl;
string product = mul(A.num, B.num);
if(A.isNeg != B.isNeg && product != "0") {
product = "-" + product;
}
cout << product << endl;
auto [quotient, remainder] = divide(A.num, B.num);
if(A.isNeg != B.isNeg && quotient != "0") {
quotient = "-" + quotient;
}
cout << quotient << endl;
if(A.isNeg && remainder != "0") {
remainder = "-" + remainder;
}
cout << remainder << endl;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
BigInt A(s1), B(s2);
solve(A, B);
return 0;
}
2. 普解:
#include <bits/stdc++.h>
using namespace std;
int main() {
short a,b;
cin>>a>>b;
cout<<a+b<<endl<<a-b<<endl<<a*b<<endl<<a/b<<endl<<a%b;
return 0;
}
这里空空如也
有帮助,赞一个