标签: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