1. 程式人生 > 其它 >AcWing 演算法基礎課 大整數、高精度

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