AcWing 算法基础课 大整数、高精度
大整数用数组表示
第一位写在index=0的位置,因为运算可能进位。
vector<int> 自带size(),方便表示大整数;
输出的时候要反向
高精度加法
要记得最后加上carry
vector<int> add(vector<int> &A, vector<int> &B)
{
if (A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);
return C;
}
作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
高精度减法
要先判断减数和被减数的大小
删除前导零
int main()
{
string a, b;
vector<int> A, B;
cin >> 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');
function<vector<int>(vector<int>&, vector<int>&)> BigNumberMinus = [](vector<int> &A, vector<int> &B)
{
int c = 0;
vector<int> res;
for (int i = 0; i < A.size() ; i++)
{
int num=c;
num += A[i];
if (i < B.size()) num -= B[i];
res.push_back((num+10) % 10);
c = num<0?-1:0;
}
while (res.size() > 1 && res.back() == 0) res.pop_back();//删除前导零
return res;
};
bool greater = true;;
if (A.size() > B.size())
greater = true;
else if (A.size() < B.size())
greater = false;
else
{
for (int i = 0; i < A.size(); i++)
{
if (A[i] < B[i])
{
greater = false;
break;
}
if (A[i] > B[i])
{
greater = true;
break;
}
}
}
vector<int> C;
if (greater) C = BigNumberMinus(A, B);
else
C = BigNumberMinus(B, A);
if (!greater)
cout << '-';
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
cout << endl;
return 0;
}
高精度乘法(大数乘小数)
通过大数的每一位乘小数(加上进位)
function<vector<int>(vector<int>&, int)> BigNumberMul = [](vector<int> &A, int b)
{
int c = 0;
vector<int> res;
for (int i = 0; i < A.size() ; i++)
{
int num=c;
num += A[i]*b;
res.push_back(num % 10);
c = num/10;
}
while (c!=0) res.push_back(c%10),c/=10;
return res;
};
高精度除法(模拟)
模拟人类的除法运算,记得reverse(统一格式)和去除前导零
function<vector<int>(vector<int>&, int,int&)> BigNumberDiv = [](vector<int> &A, int b,int &r)//大被除数,除数,余数
{
r = 0;
vector<int> res;
for (int i = A.size()-1; i >=0 ; i--)
{
int num=r*10+A[i];
res.push_back(num / b);
r = num%b;
}
reverse(res.begin(), res.end());
while (res.back()==0&&res.size()>1) res.pop_back();
return res;
};
vector<int> C;
int r;
C = BigNumberDiv(A, b,r);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人