码迷,mamicode.com
首页 > 其他好文 > 详细

大整数类

时间:2018-12-16 00:50:37      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:name   sprintf   删除   return   --   memset   字符串   bit   bre   

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int maxn=10000;//最大处理位数
  4 struct bign
  5 {
  6     int d[maxn],len; //下标从0开始 
  7     inline void clean() {while(len>1&&!d[len-1]) len--;}; //删除前导0 
  8     inline bign(){memset(d,0,sizeof(d)),len=1;}; //构造函数 
  9     inline bign(int num) {*this=num;} //使bign类型能与int类型运算 
 10     inline bign(char* num) {*this=num;} 
 11     inline bign operator = (const char* num)
 12     {
 13         memset(d,0,sizeof(d));
 14         len=strlen(num);
 15         for(int i=0;i<len;i++) d[i]=num[len-1-i]-48; //反序输入 
 16         return *this;
 17     }
 18     inline bign operator = (int num)
 19     {
 20         char s[20];
 21         sprintf(s,"%d",num);
 22         *this=s;
 23         return *this;
 24     }
 25     inline bign operator + (const bign &b) //加数为非负整数 
 26     {
 27         int x=0,i,lenmax=max(len,b.len); //x用于存放进位,lenmax为位数 
 28         bign c;c.len=lenmax;
 29         for(i=0;i<lenmax;i++)
 30         {
 31             c.d[i]=d[i]+x+b.d[i];
 32             x=c.d[i]/10;
 33             c.d[i]%=10;
 34         }
 35         x?c.d[i]=x:i--; //最高位进位 
 36         c.len=i+1;        //位数加一 
 37         return c;
 38     }
 39     inline bign operator - (const bign &b) //减数不大于被减数 
 40     {
 41         bign c=*this;
 42         for(int i=0;i<c.len;i++)
 43         {
 44             c.d[i]-=b.d[i];
 45             if(c.d[i]<0) {c.d[i]+=10;c.d[i+1]--;};
 46         }
 47         c.clean();
 48         return c;
 49     }
 50     inline bign operator * (const bign &b)  const//非负整数相乘  const表示该成员函数不改变数据成员
 51                                                  //去掉const除法编译出错 
 52     {
 53         bign c;
 54         c.len=len+b.len;
 55         for(int i=0;i<len;i++)
 56         {
 57             int x=0; //用于存放进位 
 58             for(int j=0;j<b.len;j++)
 59             {
 60                 c.d[i+j]+=x+d[i]*b.d[j];
 61                 x=c.d[i+j]/10;
 62                 c.d[i+j]%=10;
 63             }
 64             c.d[i+b.len]=x; //最高位进位
 65         }
 66         c.clean();
 67         return c; 
 68     }
 69     inline bign operator / (int b) //非负整数相除(高精除低精) 
 70     {
 71         int x=0;
 72         bign c=*this;
 73         for(int i=len-1;i>=0;i--)
 74         {
 75             x=x*10+d[i];
 76             c.d[i]=x/b;
 77             x%=b;
 78         }
 79         c.clean();
 80         return c;
 81     }
 82     inline bign operator / (const bign &b)  //非负整数相除(高精除高精) 
 83     {
 84         int i, j;
 85         bign c=*this, a=0;
 86         for (i=len - 1; i >=0; i--)
 87         {
 88             a=a*10 + d[i];
 89             for (j=0; j<10; j++) if (a<b*(j+1)) break;
 90             c.d[i]=j;
 91             a=a - b*j;
 92         }
 93         c.clean();
 94         return c;
 95     } 
 96     inline bign operator % (int b) //非负整数取模(高精模低精) 
 97     {
 98         int x=0;
 99         for(int i=len-1;i>=0;i--)
100         {
101             x=x*10+d[i];
102             d[i]=x/b;
103             x%=b;
104         }
105         clean();
106         return x;
107     }
108     inline bign operator % (const bign &b) //非负整数取模(高精模高精) 
109     {
110         int i,j;
111         bign x;
112         for(i=len-1;i>=0;i--)
113         {
114             x=x*10+d[i];
115             for(j=0;j<10;j++) if(x<b*(j+1)) break;
116             x=x-b*j;
117         }
118         return x;
119     }
120     inline bool operator < (const bign &b)  const//逻辑运算符  去掉const编译错误 
121     {
122         if(len!=b.len) return len<b.len;
123         for(int i=len-1;i>=0;i--) if(d[i]!=b.d[i]) return d[i]<b.d[i];
124         return false;
125     }
126     inline bool operator > (const bign &b) const {return b<*this;}
127     inline bool operator == (const bign &b) const {return !(b<*this)&&!(*this<b);}
128     inline bool operator != (const bign &b) const {return b<*this||*this<b;}
129     inline bool operator >= (const bign &b) const {return !(*this<b);}
130     inline bool operator <= (const bign &b) const {return !(*this>b);}
131     inline string str() const //字符串转换 去掉const输出流编译错误 
132     {
133         char s[maxn]={};
134         for(int i=0;i<len;i++) s[len-i-1]=d[i]+0;
135         return s;
136     }
137 };
138 inline istream& operator >> (istream &in,bign &x) //输入流  加上const编译错误 
139 {
140     string s;
141     in>>s;
142     x=s.c_str();
143     return in;
144 }
145 inline ostream& operator << (ostream &out,const bign &x) //输出流 去掉const编译错误 
146 {
147     out<<x.str();
148     return out; 
149 }
150 int main()
151 {
152     bign a;
153     int b; 
154     cin>>a>>b;
155     cout<<a+b;
156 }

 

大整数类

标签:name   sprintf   删除   return   --   memset   字符串   bit   bre   

原文地址:https://www.cnblogs.com/yu-xing/p/10125465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!