10494Uva(二)高精度运算 易错点

来源:互联网 发布:淘宝预热 编辑:程序博客网 时间:2024/06/16 18:27
其实bign()  
    {  
        len = 0;  
        memset(ints, 0, sizeof(ints));  
    }  
bign::len应该设置为1 ,表示一个bign 的0;

否则bign * int 容易出错:g.ints[0] = this->ints[i]; 但下次循环时len仍为0,出错


#include<stdio.h>  #include<string.h>  struct bign  {      int ints[10000];      int len;      bign& operator= (char* s)      {          len = strlen(s);          memset(ints, 0, sizeof(ints));          for(int i = 0; i < len; i++)          {              ints[i] = s[len-1-i] - '0';          }          return *this;      }      bign& operator= (int n)      {          char s[10001];          sprintf(s,"%d",n);          *this = s;          return *this;      }      bign()      {          len = 0;          memset(ints, 0, sizeof(ints));      }      bool isempty()      {          return len == 0;      }      bign(char* s)      {          *this = s;      }      bign(int n)      {          *this = n;      }      bool operator > (const bign& b) const      {          if(len > b.len) return true;          else if(len < b.len) return false;          else           {              for(int i = len-1; i >=0; i--)              {                  if(ints[i] != b.ints[i])                      return ints[i] > b.ints[i];              }              return false;          }      }      bool operator >= (const bign& b) const      {          return !(b > *this);      }      bool operator < (const bign& b) const      {          return b > *this;      }      bool operator <=(const bign& b)const       {          return !(*this > b);      }      bool operator !=(const bign& b)const      {          return *this >b || *this < b;      }      bool operator == (const bign& b)const      {          return *this <= b && *this >= b;      }      bign operator - (const bign& b)const      {          bign res;          if(*this < b) return res;          res = *this;          for(int i = 0; i < len; i++)          {              res.ints[i] -= b.ints[i];              if(res.ints[i] < 0)              {                  res.ints[i] +=10;                  res.ints[i+1]--;              }          }          int i = res.len -1;          for(;i>=0 && res.ints[i] ==0; i--)              continue;          if(i == -1)              i++;          res.len = i + 1;          return res;      }      //      bign operator* (int n)      {          char s[10010];          sprintf(s,"%d",n);          bign res;          int temp = 0;          int i;          for(i = 0; i < len; i++)           //2.如果原来设置的len == 0,那么循环永远不会执行,temp也永远==0        {              temp = n * this->ints[i] + temp;              res.ints[i] = temp%10;              temp /= 10;          } //res.len = len;        while(temp >0)          {              res.ints[i++] = temp%10;              temp /= 10;              //res.len++;        }        /*        int j;          for(j = len + strlen(s) ; j >=0 && res.ints[j] == 0; j--);          if( j==-1) j++;          res.len = j +1;            /*         printf("from *operator\n");         res.dis();         */          return res;                }        bign operator/ (const bign& b)const      {          bign res,g;          int i = this->len-1;          for(; i>=0 ;i--)          {              g = g *10;              g.ints[0] = this->ints[i];    if(g.len == 0) g.len++;         //1.len==0时,g =g*10 不会自动修改len        /*            printf("from / remains\n");             g.dis();             putchar('\n');             */            while(g >= b)              {                  g = g - b;                  res.ints[i]++;              }                       }          int j;          for(j = this->len-1; j >=0 && res.ints[j] == 0; j--);          if( j==-1) j++;          res.len = j +1;          return res;      }      bign operator% (const bign& b)const      {          bign res,g;          int i = this->len-1;          for(; i>=0 ;i--)          {              g = g *10;              g.ints[0] = this->ints[i]; if(g.len == 0) g.len++;            while(g >= b)              {                  g = g - b;                  //res.ints[i]++;              }            }          int j;          for(j = this->len-1; j >=0 && g.ints[j] == 0; j--);          if( j==-1) j++;          g.len = j +1;          return g;      }      void dis()      {          for(int i = 0; i < len; i++)          {              printf("%d", ints[len-1-i]);          }          putchar('\n');      }  };  void eatzero(char* s)  {      int i;      for(i = 0; i < strlen(s) && s[i] =='0'; i++)          continue;      if(strlen(s) == i)          i--;      int len =0;      for(int j =i; j < strlen(s); j++)      {          s[len++] = s[j];      }      s[len] = '\0';      //printf("%s\n", s);  }  int main()  {      freopen("input.txt","r",stdin);      char first[10100];      char sec[10100];      char sign;      while(scanf("%s %c %s",first,&sign,&sec)==3)      {          eatzero(first);          eatzero(sec);          bign f = first;          //f.dis();          bign s = sec;          //s.dis();          bign temp;          if(sign == '/')              temp = f/s;          else temp = f % s;          temp.dis();      }  }  



 

0 0
原创粉丝点击