bign模版高精度模版

来源:互联网 发布:centos kernel devel 编辑:程序博客网 时间:2024/04/27 23:21
const int MAXN = 500;  struct bign  {      int len, s[MAXN];      bign ()      {          memset(s, 0, sizeof(s));          len = 1;      }      bign (int num) { *this = num; }      bign (const char *num) { *this = num; }      bign operator = (const int num)      {          char s[MAXN];          sprintf(s, "%d", num);          *this = s;          return *this;      }      bign operator = (const char *num)      {          for(int i = 0; num[i] == '0'; num++) ;  //去前导0          len = strlen(num);          for(int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';          return *this;      }      bign operator + (const bign &b) const //+      {          bign c;          c.len = 0;          for(int i = 0, g = 0; g || i < max(len, b.len); i++)          {              int x = g;              if(i < len) x += s[i];              if(i < b.len) x += b.s[i];              c.s[c.len++] = x % 10;              g = x / 10;          }          return c;      }      bign operator += (const bign &b)      {          *this = *this + b;          return *this;      }      void clean()      {          while(len > 1 && !s[len-1]) len--;      }      bign operator * (const bign &b) //*      {          bign c;          c.len = len + b.len;          for(int i = 0; i < len; i++)          {              for(int j = 0; j < b.len; j++)              {                  c.s[i+j] += s[i] * b.s[j];              }          }          for(int i = 0; i < c.len; i++)          {              c.s[i+1] += c.s[i]/10;              c.s[i] %= 10;          }          c.clean();          return c;      }      bign operator *= (const bign &b)      {          *this = *this * b;          return *this;      }      bign operator - (const bign &b)      {          bign c;          c.len = 0;          for(int i = 0, g = 0; i < len; i++)          {              int x = s[i] - g;              if(i < b.len) x -= b.s[i];              if(x >= 0) g = 0;              else              {                  g = 1;                  x += 10;              }              c.s[c.len++] = x;          }          c.clean();          return c;      }      bign operator -= (const bign &b)      {          *this = *this - b;          return *this;      }      bign operator / (const bign &b)      {          bign c, f = 0;          for(int i = len-1; i >= 0; i--)          {              f = f*10;              f.s[0] = s[i];              while(f >= b)              {                  f -= b;                  c.s[i]++;              }          }          c.len = len;          c.clean();          return c;      }      bign operator /= (const bign &b)      {          *this  = *this / b;          return *this;      }      bign operator % (const bign &b)      {          bign r = *this / b;          r = *this - r*b;          return r;      }      bign operator %= (const bign &b)      {          *this = *this % b;          return *this;      }      bool operator < (const bign &b)      {          if(len != b.len) return len < b.len;          for(int i = len-1; i >= 0; i--)          {              if(s[i] != b.s[i]) return s[i] < b.s[i];          }          return false;      }      bool operator > (const bign &b)      {          if(len != b.len) return len > b.len;          for(int i = len-1; i >= 0; i--)          {              if(s[i] != b.s[i]) return s[i] > b.s[i];          }          return false;      }      bool operator == (const bign &b)      {          return !(*this > b) && !(*this < b);      }      bool operator != (const bign &b)      {          return !(*this == b);      }      bool operator <= (const bign &b)      {          return *this < b || *this == b;      }      bool operator >= (const bign &b)      {          return *this > b || *this == b;      }      string str() const      {          string res = "";          for(int i = 0; i < len; i++) res = char(s[i]+'0') + res;          return res;      }  };  istream& operator >> (istream &in, bign &x)  {      string s;      in >> s;      x = s.c_str();      return in;  }  ostream& operator << (ostream &out, const bign &x)  {      out << x.str();      return out;  }  

struct bign{    int len, sex;    int s[2000];    bign()    {        this -> len = 1;        this -> sex = 0;        memset(s, 0, sizeof(s));    }    bign operator = (const char *number)    {        int begin = 0;        len = 0;        sex = 1;        if (number[begin] == '-')        {            sex = -1;            begin++;        }        else if (number[begin] == '+')            begin++;        for (int j = begin; number[j]; j++)            s[len++] = number[j] - '0';    }    bign operator = (int number)    {        char string[N];        sprintf(string, "%d", number);        *this = string;        return *this;    }    bign (int number)    {        *this = number;    }    bign (const char* number)    {        *this = number;    }    bign change(bign cur)    {        bign now;        now = cur;        for (int i = 0; i < cur.len; i++)            now.s[i] = cur.s[cur.len - i - 1];        return now;    }    void delZore()      // 删除前导0.    {        bign now = change(*this);        while (now.s[now.len - 1] == 0 && now.len > 1)        {            now.len--;        }        *this = change(now);    }    void put()      // 输出数值。    {        delZore();        if (sex < 0 && (len != 1 || s[0] != 0))            cout << "-";        for (int i = 0; i < len; i++)            cout << s[i];    }    bign operator + (const bign &cur)    {        bign sum, a, b;        sum.len = 0;        a = a.change(*this);        b = b.change(cur);        for (int i = 0, g = 0; g || i < a.len || i < b.len; i++)        {            int x = g;            if (i < a.len) x += a.s[i];            if (i < b.len) x += b.s[i];            sum.s[sum.len++] = x % 10;            g = x / 10;        }        return sum.change(sum);    }    bign operator - (const bign &cur)    {        bign sum, a, b;        sum.len = len;        a = a.change(*this);        b = b.change(cur);        for (int i = 0; i < b.len; i++)        {            sum.s[i] = a.s[i] - b.s[i] + sum.s[i];            if (sum.s[i] < 0)            {                sum.s[i] += 10;                sum.s[i + 1]--;            }        }        for (int i = b.len; i < a.len; i++)        {            sum.s[i] += a.s[i];            if (sum.s[i] < 0)            {                sum.s[i] += 10;                sum.s[i + 1]--;            }        }        return sum.change(sum);    }};
原创粉丝点击