AcWing-高精度-加法-减法-乘法
高精度加法
#include <iostream>
#include <vector>
using namespace std;
const int N = 200 + 11;
vector<int> add(vector<int>& v1,vector<int>& v2){
vector<int> res;
int t = 0;
int i = 0,j = 0;
while(i < v1.size() || j < v2.size()){
if(i < v1.size()) t += v1[i++];
if(j < v2.size()) t += v2[j++];
res.push_back(t%10);
t /= 10;
}
if(t > 0) res.push_back(t);
return res;
}
int main(int argc, char const *argv[]){
string a,b; cin >> a >> b;
vector<int> v1,v2;
for(int i = a.length()-1; i >= 0; i--) v1.push_back(a[i]-'0');
for(int i = b.length()-1; i >= 0; i--) v2.push_back(b[i]-'0');
vector<int> res = add(v1,v2);
while(res.size() > 1 && res.back() == 0) res.pop_back(); //去除前导0
for(int i = res.size()-1; i >= 0; i--) cout << res[i]; cout << endl;
return 0;
}
高精度减法
#include <iostream>
#include <vector>
using namespace std;
bool cmp(vector<int>& v1,vector<int>& v2){
if(v1.size() != v2.size()) return v1.size() > v2.size();
for(int i = v1.size()-1; i >= 0; i--){
if(v1[i] != v2[i])
return v1[i] > v2[i];
}
return true;
}
vector<int> sub(vector<int>&v1, vector<int>&v2){
vector<int> res;
int t = 0;
for(int i = 0; i < v1.size();i++){
v1[i] += t; //借位
if(i < v2.size()) v1[i] -= v2[i];
res.push_back((v1[i]+10)%10);
if(v1[i] < 0) t = -1;
else t = 0;
}
//去掉高位0
while(res.size() > 1 && res.back() == 0) res.pop_back();
return res;
}
int main(){
string a,b; cin >> a >> b;
vector<int> v1,v2;
for(int i = a.length()-1; i >= 0; i--) v1.push_back(a[i]-'0');
for(int i = b.length()-1; i >= 0; i--) v2.push_back(b[i]-'0');
if(cmp(v1,v2)){
auto v3 = sub(v1,v2);
for(int i = v3.size()-1; i >= 0; i--) cout << v3[i];
}else{
cout << "-";
auto v3 = sub(v2,v1);
for(int i = v3.size()-1; i >= 0; i--) cout << v3[i];
}
return 0;
}
高精度乘法
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 1e5 + 11;
// 11*12
//v1 11
//v2 21
//2 2
// 1 1
//2 3 1
vector<int> mul(vector<int>& v1,vector<int>& v2){ //v1*v2
vector<int> v3(v1.size()+v2.size()+11,0);
for(int i = 1; i < v2.size(); i++){
for(int j = 1; j < v1.size(); j++){
v3[i+j-1] += v1[j]*v2[i];
if(v3[i+j-1] > 9){
v3[i+j] += v3[i+j-1]/10;
v3[i+j-1] = v3[i+j-1] % 10;
}
}
}
//去前导0
while(v3.size() > 2 && v3.back() == 0) v3.pop_back();
return v3;
}
int main(){
string a,b; cin >> a >> b;
vector<int> v1,v2;
//v1,v2的下标一定要从1开始,c[i+j-1] = a[i]*b[j]才成立
v1.push_back(0);
v2.push_back(0);
for(int i = a.length()-1; i >= 0; i--) v1.push_back(a[i]-'0');
for(int i = b.length()-1; i >= 0; i--) v2.push_back(b[i]-'0');
vector<int> res = mul(v1,v2);
for(int i = res.size()-1; i >= 1; i--) cout << res[i];
cout << endl;
return 0;
}
高精度除法
正着存放,[高位,低位]
不需要翻转,不需要个位存储在下标低的地方
a[maxn]
存储被除数,
c[maxn]
存储除数
b
是除数
x
是余数
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int x = 0; //余数
deque<int> div(vector<int>& a,int b){
//a是被除数,b是除数
deque<int> c(a.size()); //商集合
for(int i = 0; i < a.size(); i++){
c[i] = (x*10 + a[i]) / b;
x = (x*10 + a[i]) % b;
}
while(c.size() > 1 && c.front() == 0) c.pop_front(); //注意清除的是前置0
return c;
}
int main(){
// s1 >= s2
int b;
string s1; cin >> s1 >> b;
vector<int>a;
for(int i = 0; i < s1.length(); i++) a.push_back(s1[i]-'0');
deque<int> c = div(a,b);
for(int i = 0; i < c.size(); i++) cout << c[i];
cout << endl << x << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了