讨厌的高精度算法/(ㄒoㄒ)/~~
2026-09-05 18:05:25
发布于:浙江
我非常喜欢高精度算法
我非常非常讨厌高精度算法
它真的非常非常的难做+难理解
代码如下
自行查看⬇
//* 高精度加法 * 例 5467556748678436 + 564385748932014704;
#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];
if(c[i]>9){
c[i+1]+=1;
c[i]%=10;
}
c[i]+='0';
if(i==a.size()-1) c[i+1]+='0';
}
RESULT(c);
cout<<c;
return 0;
}
//* 高精度减法 * 例 9878966756544 - 564385748932014704;
#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;
// 两个数字相减的结果,位数最多不超过 a, b 两数最长位数
int lenght = max(a.size(), b.size());
string c(lenght,0);
bool neg=false;
if(a.size()<b.size()||(a.size()==b.size()&&a<b)){
neg=true;
swap(a,b);
}
// 字符串反转,方便相减退位,同时变为整数
FIX(a,lenght);
FIX(b,lenght);
for(int i=0;i<lenght;i++){
c[i]+=a[i]-b[i];
if(c[i]<0){
c[i+1]-=1;
c[i]+=10;
}
c[i]+='0';
}
RESULT(c);
if(neg){
cout<<"-";
}
cout<<c;
return 0;
}
//* 高精度乘法 * 例 9878966756544 * 564385748932014704;
#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;
}
//* 高精度除法 * 例 9878966756544 / 564385748932014704;
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 将高位 '0' 删除,这次不需要反转,而且删除的是 front
void RESULT(string& s) {
while (s.size() > 1 && s.front() == '0') s.erase(s.begin());
}
int main() {
string a;
int b;
cin >> a >> b;
// c 商的结果, div 表示这一次的被除数是多少
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'); // 将这一位的商拼接到字符串 c 中
div %= b; // div 剩下的余数变为被除数
}
RESULT(c);
cout << c;
return 0;
}
做完后😭😭😭/(ㄒoㄒ)/~~
全部评论 1
真的灰常灰常讨厌



2026-09-09 来自 浙江
1代码中有些是复制,因为真的懒得写




2026-09-09 来自 浙江
1如果重生之,我将不会再学C++。
2026-09-09 来自 浙江
1谁爱学谁学吧,老娘是不学了


2026-09-09 来自 浙江
0


















有帮助,赞一个