• 大整数类


      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 }
  • 相关阅读:
    艾伟_转载:二十行C#代码打造Ruby Markup Builder 狼人:
    艾伟_转载:WCF基本异常处理模式[上篇] 狼人:
    UVA 11389 The Bus Driver Problem(贪心)
    java list内部构造
    【人在运维囧途_04】 逃离故障的十条运维的工作经验总结
    Windows phone8 基础篇(一) 环境搭建和项目结构说明
    jquery如何把参数列严格转换成数组
    ORA27102: out of memory 故障
    卢松松:周一的文章最难写 晚上发文最合适
    Android开发环境搭建
  • 原文地址:https://www.cnblogs.com/yu-xing/p/10125465.html
Copyright © 2020-2023  润新知