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);

posted @   80k  阅读(56)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示