c++类实现求调
查看原帖
c++类实现求调
681755
CuteGirlGC楼主2023/12/27 23:25
#include <iostream>
#include <string.h>

using namespace std;
class BigInt {
 private:
  static const int kMaxN = 1e5 + 1;
  int Len = 0, Num[kMaxN] = {};
  bool Neg = 0;

 public:
  BigInt() {
    Len = 0, Neg = 0;
    fill(Num, Num + kMaxN, 0);
  }
  BigInt(string WUYIXUAN_) {
    if (WUYIXUAN_[0] == '-') {
      WUYIXUAN_ = WUYIXUAN_.substr(1);
      Neg = 1;
    }
    Len = WUYIXUAN_.size();
    for (int i = 1, j = Len - 1; i <= Len; i++, j--) {
      Num[i] = WUYIXUAN_[j] - '0';
    }
  }
  BigInt(int WUYIXUAN_) {
    string s = to_string(WUYIXUAN_);
    if (s[0] == '-') {
      s = s.substr(1);
      Neg = 1;
    }
    Len = s.size();
    for (int i = 1, j = Len - 1; i <= Len; i++, j--) {
      Num[i] = s[j] - '0';
    }
  }
  BigInt(long long WUYIXUAN_) {
    string s = to_string(WUYIXUAN_);
    if (s[0] == '-') {
      s = s.substr(1);
      Neg = 1;
    }
    Len = s.size();
    for (int i = 1, j = Len - 1; i <= Len; i++, j--) {
      Num[i] = s[j] - '0';
    }
  }
  BigInt(const char* s) {
    Len = strlen(s);
    for (int i = 1, j = Len - 1; i <= Len; i++, j--) {
      Num[i] = s[j] - '0';
    }
  }
  int Size() {
    while (!Num[Len]) {
      Len--;
    }
    Len += !Len;
    return Len;
  }
  BigInt SubInt(int start, int len) {
    len = len == 0 ? Len - len + 1 : len;
    BigInt ans;
    int end = start + len;
    ans.Len = end - start + 1;
    for (int i = 1, j = start; i <= ans.Len; i++, j++) {
      ans.Num[i] = this -> Num[j];
    }
    end = ans.Size();
    return ans;
  }
  bool CanSub(BigInt WUYIXUAN_, int pos) {
    BigInt o = *this;
    if (o.Len < pos + WUYIXUAN_.Len) {
      return 0;
    }
    return this -> SubInt(pos, WUYIXUAN_.Len) >= WUYIXUAN_;
  }
  friend BigInt operator+(BigInt WUYIXUAN_, BigInt WYX) {
    if (WUYIXUAN_.Neg && !WYX.Neg) {
      WUYIXUAN_.Neg = 0;
      return WYX - WUYIXUAN_;
    } else if (!WUYIXUAN_.Neg && WYX.Neg) {
      WYX.Neg = 0;
      return WUYIXUAN_ - WYX;
    }
    BigInt ans;
    ans.Len = max(WUYIXUAN_.Len, WYX.Len);
    for (int i = 1; i <= ans.Len; i++) {
      ans.Num[i] = WUYIXUAN_.Num[i] + WYX.Num[i];
    }
    for (int i = 1; i <= ans.Len; i++) {
      ans.Num[i + 1] += ans.Num[i] / 10, ans.Num[i] %= 10;
    }
    if (ans.Num[ans.Len + 1]) {
      ans.Len++;
    }
    return ans;
  }
  BigInt operator+=(BigInt WUYIXUAN_) {
    *this = *this + WUYIXUAN_;
    return *this;
  }
  friend bool operator<(BigInt WUYIXUAN_, BigInt WYX) {
    if (WUYIXUAN_.Neg ^ WYX.Neg) {
      return WUYIXUAN_.Neg != 1;
    }
    if (WUYIXUAN_.Len != WYX.Len) {
      return WUYIXUAN_.Len < WYX.Len;
    }
    for (int i = 1; i <= WUYIXUAN_.Len; i++) {
      if (WUYIXUAN_.Num[i] != WYX.Num[i]) {
        return WUYIXUAN_.Num[i] < WYX.Num[i];
      }
    }
    return 0;
  }
  friend bool operator==(BigInt WUYIXUAN_, BigInt WYX) {
    if (WUYIXUAN_.Len != WYX.Len) {
      return 0;
    }
    for (int i = 1; i <= WUYIXUAN_.Len; i++) {
      if (WUYIXUAN_.Num[i] != WYX.Num[i]) {
        return 0;
      }
    }
    return 1;
  }
  friend bool operator>(BigInt WUYIXUAN_, BigInt WYX) {
    return !(WUYIXUAN_ < WYX);
  }
  friend bool operator<=(BigInt WUYIXUAN_, BigInt WYX) {
    return WUYIXUAN_ < WYX || WUYIXUAN_ == WYX;
  }
  friend bool operator>=(BigInt WUYIXUAN_, BigInt WYX) {
    return WUYIXUAN_ > WYX || WUYIXUAN_ == WYX;
  }
  friend ostream &operator<<(ostream &cout, BigInt num) {
    if (num.Neg) {
      cout.put('-');
    }
    for (int i = num.Len; i >= 1; i--) {
      cout.put(num.Num[i] + '0');
    }
    return cout;
  }
  friend BigInt operator-(BigInt WUYIXUAN_, BigInt WYX) {
    if (WUYIXUAN_.Neg && !WYX.Neg) {
      WUYIXUAN_.Neg = 0;
      BigInt ret = WUYIXUAN_ + WYX;
      ret.Neg = 1;
      return ret;
    }
    if (WYX.Neg) {
      WYX.Neg = 0;
      return WUYIXUAN_ + WYX;
    } else if (WUYIXUAN_.Neg) {
      WUYIXUAN_.Neg = 0;
      return WYX - WUYIXUAN_;
    }
    if (WUYIXUAN_ < WYX) {
      BigInt ret = WYX - WUYIXUAN_;
      ret.Neg = 1;
      return ret;
    }
    BigInt ans;
    ans.Len = WUYIXUAN_.Len;
    for (int i = 1; i <= ans.Len; i++) {
      ans.Num[i] = WUYIXUAN_.Num[i] - WYX.Num[i];
    }
    for (int i = 1; i <= ans.Len; i++) {
      if (ans.Num[i] < 0) {
        ans.Num[i + 1]--, ans.Num[i] += 10;
      }
    }
    while (ans.Len && !ans.Num[ans.Len]) {
      ans.Len--;
    }
    if (!ans.Len) {
      ans.Len++;
    }
    return ans;
  }
  BigInt operator-=(BigInt WUYIXUAN_) {
    *this = *this - WUYIXUAN_;
    return *this;
  }
  friend BigInt operator*(BigInt WUYIXUAN_, BigInt WYX) {
    BigInt ans;
    ans.Len = WUYIXUAN_.Len + WYX.Len;
    for (int i = 1; i <= WUYIXUAN_.Len; i++) {
      for (int j = 1; j <= WYX.Len; j++) {
        ans.Num[i + j - 1] += WUYIXUAN_.Num[i] * WYX.Num[j];
      }
    }
    for (int i = 1; i <= ans.Len; i++) {
      ans.Num[i + 1] += ans.Num[i] / 10, ans.Num[i] %= 10;
    }
    while (!ans.Num[ans.Len]) {
      ans.Len--;
    }
    ans.Len += !ans.Len;
    ans.Neg = WUYIXUAN_.Neg ^ WYX.Neg;
    return ans;
  }
  BigInt operator*=(BigInt WUYIXUAN_) {
    *this = *this * WUYIXUAN_;
    return *this;
  }
  BigInt operator<<(int WUYIXUAN_) {
    BigInt o = *this;
    for (int i = 0; i < WUYIXUAN_; i++) {
      o *= 2;
    }
    return o;
  }
  BigInt operator<<=(int WUYIXUAN_) {
    *this = *this << WUYIXUAN_;
    return *this;
  }
  BigInt &operator++() {
    *this += 1;
    return *this;
  }
  BigInt operator++(int) {
    BigInt temp = *this;
    *this += 1;
    return temp;
  }
  BigInt &operator--() {
    *this -= 1;
    return *this;
  }
  BigInt operator--(int) {
    BigInt temp = *this;
    *this -= 1;
    return temp;
  }
  friend BigInt operator/(BigInt WUYIXUAN_, BigInt WYX) {
    BigInt ans;
    ans.Neg = WUYIXUAN_.Neg ^ WYX.Neg;
    if (WYX == 0) {
      cerr << "Segment Fault : Division 0";
      exit(-1);
    }
    if (WUYIXUAN_ < WYX) {
      return 0;
    }
    if (WUYIXUAN_ == WYX) {
      return 1;
    }
    for (int i = WUYIXUAN_.Len - WYX.Len + 1; i >= 1; i--) {
      while (WUYIXUAN_.CanSub(WYX, i)) {
        for (int j = 1; j <= WYX.Len; j++) {
          WUYIXUAN_.Num[i + j - 1] -= WYX.Num[j];
          if (WUYIXUAN_.Num[i + j - 1] < 0) {
            WUYIXUAN_.Num[i + j]--;
            WUYIXUAN_.Num[i + j - 1] += 10;
          }
        }
        ans.Num[i]++, ans.Len = max(ans.Len, i);
      }
    }
    return ans;
  }
  BigInt operator/=(BigInt WUYIXUAN_) {
    *this = *this / WUYIXUAN_;
    return *this;
  }
  friend BigInt operator%(BigInt WUYIXUAN_, BigInt WYX) {
    return WUYIXUAN_ - WYX * (WUYIXUAN_ / WYX);
  }
  BigInt operator%=(BigInt WUYIXUAN_) {
    *this = *this % WUYIXUAN_;
    return *this;
  }
  BigInt operator>>(int WUYIXUAN_) {
    BigInt o = *this;
    for (int i = 0; i < WUYIXUAN_; i++) {
      o /= 2;
    }
    return o;
  }
  BigInt operator>>=(int WUYIXUAN_) {
    *this = *this >> WUYIXUAN_;
    return *this;
  }
  friend istream &operator>>(istream &cin, BigInt &num) {
    char c = cin.get();
    while (!isdigit(c) && c != '-') {
      c = cin.get();
    }
    if (isdigit(c)) {
      num = c - '0';
    } else {
      num.Neg = 1;
    }
    c = cin.get();
    while (isdigit(c)) {
      num = num * 10 + (c - '0');
      c = cin.get();
    }
    return cin;
  }
}A, B;

int main() {
  cin >> A >> B;
  cout << A + B << '\n' << A - B << '\n' << A * B << '\n' << A / B << '\n' << A % B << '\n';
  return 0;
}

shit山代码

2023/12/27 23:25
加载中...