【基础算法】高精度专题
高精度模板
加法
vector<int> add(vector<int>& A, vector<int>& B) // 高精度加法
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || i < B.size(); i ++ )
{
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(1);
return C;
}
减法
bool cmp(vector<int>& A, vector<int>& B) // 判断A >= 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> sub(vector<int>& A, 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);
if (t < 0) t = 1;
else t = 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
乘法
大数乘小数
// C = A * b
vector<int> mul(vector<int> &A,int b)
{
vector<int> C;
int t = 0;
for(int i = 0; i < A.size(); i++)
{
if(i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(t);
while(C.size() > 1 && C.back() == 0) C.pop_back();//去掉前导0
return C;
}
大数乘大数
vector<int> mul(vector<int>& A, 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;
}
除法
// A / b 商是C 余数是r
vector<int> div(vector<int> &A, int b, int &r)// 这里r传的是引用
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i -- )
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(),C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
3389. N 的阶乘
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1010;
vector<int> F[N];
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
for(int i = 0, t = 0; i < A.size() || t; i ++ )
{
if(i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
int main()
{
int n;
F[0] = {1};
for(int i = 1; i <= 1000; i ++ ) F[i] = mul(F[i - 1], i);
while(cin >> n)
{
for(int i = F[n].size() - 1; i >= 0; i -- )
{
cout << F[n][i];
}
cout << endl;
}
return 0;
}
作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/3006568/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3448. 基本算术
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int add(vector<int> &A, vector<int> &B)
{
int res = 0;
for(int i = 0, t = 0; i < A.size() || i < B.size() || t; i ++ )
{
if(i < A.size()) t += A[i];
if(i < B.size()) t += B[i];
t /= 10;
res += t;
}
return res;
}
int main()
{
string a, b;
while(cin >> a >> b, a != "0" || b != "0")
{
vector<int> A, B;
for(int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
for(int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');
if(add(A, B) == 0) printf("No carry operation.\n");
else if(add(A, B) == 1) printf("%d carry operation.\n", add(A, B));
else printf("%d carry operations.\n", add(A, B));
}
return 0;
}
作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/3009963/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3453. 整数查询
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
for(int i = 0, t = 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;
}
int main()
{
vector<int> A{0};
string b;
while(cin >> b, b != "0")
{
vector<int> B;
for(int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');
A = add(A, B);
}
while(A.size() > 1 && A.back() == '0') A.pop_back(); //去掉前导零
for(int i = A.size() - 1; i >= 0; i -- ) cout << A[i];
cout << endl;
return 0;
}
作者:NFYD
链接:https://www.acwing.com/activity/content/code/content/3014579/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3482. 大数运算
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>& A, vector<int>& B) // 高精度加法
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || i < B.size(); i ++ )
{
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(1);
return C;
}
bool cmp(vector<int>& A, vector<int>& B) // 判断A >= 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> sub(vector<int>& A, 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);
if (t < 0) t = 1;
else t = 0;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
vector<int> mul(vector<int>& A, 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;
}
void print(vector<int>& C) // 因为要多次输出,所以封装成函数
{
for (int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
puts("");
C.clear();
}
int main()
{
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i -- )
if (a[i] != '-')
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i -- )
if (b[i] != '-')
B.push_back(b[i] - '0');
vector<int> C;
if (a[0] != '-' && b[0] != '-') // a + b, a - b, a * b
{
C = add(A, B);
print(C);
if (cmp(A, B)) C = sub(A, B);
else
{
C = sub(B, A);
printf("-");
}
print(C);
C = mul(A, B);
print(C);
}
else if (a[0] == '-' && b[0] == '-') // (-a) + (-b), (-a) - (-b), (-a) * (-b)
{
C = add(A, B);
printf("-");
print(C);
if (cmp(A, B))
{
printf("-");
C = sub(A, B);
print(C);
}
else
{
C = sub(B, A);
print(C);
}
C = mul(A, B);
print(C);
}
else if (a[0] == '-' && b[0] != '-') // (-a) + b, (-a) - b, (-a) * b
{
if (cmp(A, B))
{
C = sub(A, B);
printf("-");
}
else C = sub(B, A);
print(C);
printf("-");
C = add(A, B);
print(C);
printf("-");
C = mul(A, B);
print(C);
}
else if (a[0] != '0' && b[0] == '-') // a + (-b), a - (-b), a * (-b)
{
if (cmp(A, B)) C = sub(A, B);
else
{
C = sub(B, A);
printf("-");
}
print(C);
C = add(A, B);
print(C);
printf("-");
C = mul(A, B);
print(C);
}
return 0;
}
分类:
基础算法 / 高精度
, 基础算法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程