高精度算法
2026-09-05 17:42:23
发布于:浙江
高精度加法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 将较短的字符串高位补齐相同长度,同时将这个字符串转变为整数
void FIX(string& s, int length) {
reverse(s.begin(), s.end());
while (s.length() != length) {
s.push_back('0');
}
for (int i = 0; i < s.size(); i++) {
s[i] -= '0';
}
}
// 将高位 '0' 删除,最终反转
void RESULT(string& s) {
while (s.size() > 1 && s.back() == '0') s.pop_back();
reverse(s.begin(), s.end());
}
int main() {
string a, b;
cin >> a >> b;
int length = max(a.size(), b.size());
// 两个数字相加的结果,位数最多不超过 a, b 两数最长位数 + 1(进位所得)
string c(length + 1, 0);
// 字符串反转,方便相加进位,同时变为整数
FIX(a, length);
FIX(b, length);
for(int i=0;i<length;i++){
c[i]+=a[i]+b[i];
c[i+1]+=c[i]/10;
c[i]%=10;
c[i]+='0';
if(i==a.size()-1){
c[i+1]+='0';
}
}
RESULT(c);
cout<<c;
return 0;
}
高精度减法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void FIX(string& s, int length) {
reverse(s.begin(), s.end());
while (s.length() != length) {
s.push_back('0');
}
for (int i = 0; i < s.size(); i++) {
s[i] -= '0';
}
}
void RESULT(string& s) {
while (s.size() > 1 && s.back() == '0') s.pop_back();
reverse(s.begin(), s.end());
}
int main() {
string a, b;
cin >> a >> b;
int length = max(a.size(), b.size());
string c(length,0);
if(a.size()<b.size() || (a.size()==b.size() && a<b)){
cout<<"-";
swap(a,b);
}
else if(a==b){
cout<<'0';
return 0;
}
FIX(a,length);
FIX(b,length);
for(int i=0;i<length;i++){
c[i]+=a[i]-b[i];
if(c[i]<0){
c[i+1]-=1;
c[i]+=10;
}
c[i]+='0';
}
RESULT(c);
cout<<c;
return 0;
}
高精度除法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void RESULT(string& s) {
while (s.size() > 1 && s.front() == '0') s.erase(s.begin());
}
int main() {
string a;
int b;
cin >> a >> b;
string c;
long long div = 0;
for (int i = 0; i < a.size(); i++) {
div = div * 10 + a[i] - '0';
c += char(div / b + '0');
div %= b;
}
RESULT(c);
cout << c;
return 0;
}
高精度乘法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 将这个字符串转变为整数,乘法不用补齐了,记得去字符化
void FIX(string& s) {
reverse(s.begin(), s.end());
for (int i = 0; i < s.size(); i++) {
s[i] -= '0';
}
}
// 将高位 0 删除(因为可能多个进位,将字符化放在了最后),最终反转
void RESULT(string& s) {
while (s.size() > 1 && s.back() == 0) s.pop_back();
for (int i = 0; i < s.size(); i++) {
s[i] += '0';
}
reverse(s.begin(), s.end());
}
int main() {
string a, b;
cin >> a >> b;
int length = a.size() + b.size();
// 两个数字相乘的结果,位数最多不超过 a, b 两数位数之和
string c(length, 0);
FIX(a);
FIX(b);
for (int i = 0; i < a.size(); i++) {
for (int j = 0 ; j < b.size(); j++) {
int k = i + j;
c[k] += a[i] * b[j];
if (c[k] > 9) {
c[k + 1] += c[k] / 10;
c[k] %= 10;
}
}
}
RESULT(c);
cout << c;
return 0;
}
全部评论 1
我是大好人

2026-09-05 来自 浙江
0




















有帮助,赞一个