完全大数(高精度)模版
注意这个是在网上收集的,减法有一个地方有错误,我已经修正,下面是修正后的大数模板
这个模板不支持负数
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <string.h> 5 using namespace std; 6 /* 7 * 完全大数模板 8 * 输入cin>>a 9 * 输出a.print(); 10 * 注意这个输入不能自动去掉前导0的,可以先读入到char数组,去掉前导0,再用构造函数。 11 */ 12 #define MAXN 9999 13 #define MAXSIZE 1010 //输入输出的长度 14 #define DLEN 4 15 class BigNum { 16 private: int a[500]; //可以控制大数的位数 17 int len; 18 public: 19 BigNum() 20 {len=1;memset(a,0,sizeof(a));} //构造函数 21 BigNum(const int); //将一个int类型的变量转化成大数 22 BigNum(const char*); //将一个字符串类型的变量转化为大数 23 BigNum(const BigNum &); //拷贝构造函数 24 BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算 25 friend istream& operator>>(istream&,BigNum&); //重载输入运算符 26 friend ostream& operator<<(ostream&,BigNum&); //重载输出运算符 27 BigNum operator+(const BigNum &)const; //重载加法运算符,两个大数之间的相加运算 28 BigNum operator-(const BigNum &)const; //重载减法运算符,两个大数之间的相减运算 29 BigNum operator*(const BigNum &)const; //重载乘法运算符,两个大数之间的相乘运算 30 BigNum operator/(const int &)const; //重载除法运算符,大数对一个整数进行相除 运算 31 BigNum operator^(const int &)const; //大数的n次方运算 32 int operator%(const int &)const; //大数对一个int类型的变量进行取模运算 33 bool operator>(const BigNum &T)const; //大数和另一个大数的大小比较 34 bool operator>(const int &t)const; //大数和一个int类型的变量的大小比较 35 void print(); //输出大数 36 }; 37 BigNum::BigNum(const int b) //将一个int类型的变量转化为大数 38 { int c,d=b; 39 len=0; 40 memset(a,0,sizeof(a)); 41 while(d>MAXN) 42 { 43 c=d-(d/(MAXN+1))*(MAXN+1); 44 d=d/(MAXN+1); 45 a[len++]=c; 46 } a[len++]=d; 47 } 48 BigNum::BigNum(const char *s) //将一个字符串类型的变量转化为大数 49 { 50 int t,k,index,L,i; 51 memset(a,0,sizeof(a)); 52 L=strlen(s); 53 len=L/DLEN; 54 if(L%DLEN)len++; 55 index=0; 56 for(i=L-1;i>=0;i-=DLEN) 57 { 58 t=0; 59 k=i-DLEN+1; 60 if(k<0)k=0; 61 for(int j=k;j<=i;j++) 62 t=t*10+s[j]-'0'; 63 a[index++]=t; 64 } 65 } 66 BigNum::BigNum(const BigNum &T):len(T.len) //拷贝构造函数 67 { 68 int i; 69 memset(a,0,sizeof(a)); 70 for(i=0;i<len;i++) 71 a[i]=T.a[i]; 72 } 73 BigNum & BigNum::operator=(const BigNum &n) //重载赋值运算符,大数之间赋值运算 74 { 75 int i; 76 len=n.len; 77 memset(a,0,sizeof(a)); 78 for(i=0;i<len;i++) 79 a[i]=n.a[i]; 80 return *this; 81 } 82 istream& operator>>(istream &in,BigNum &b) 83 { 84 char ch[MAXSIZE*4]; 85 int i=-1; 86 in>>ch; 87 int L = strlen(ch); 88 int count = 0, sum = 0; 89 for (i = L - 1; i >= 0;) 90 { 91 sum = 0; 92 int t = 1; 93 for (int j = 0; j<4 && i >= 0; j++, i--, t *= 10) 94 { 95 sum += (ch[i] - '0')*t; 96 } 97 b.a[count] = sum; 98 count++; 99 } 100 b.len = count++; 101 return in; 102 } 103 ostream& operator<<(ostream& out, BigNum& b) //重载输出运算符 104 { 105 int i; 106 cout<<b.a[b.len-1]; 107 for(i=b.len-2;i>=0;i--) 108 { 109 printf("%04d",b.a[i]); 110 } 111 return out; 112 } 113 BigNum BigNum::operator+(const BigNum &T)const //两个大数之间的相加运算 114 { 115 BigNum t(*this); 116 int i,big; 117 big=T.len>len?T.len:len; 118 for(i=0;i<big;i++) 119 { 120 t.a[i]+=T.a[i]; 121 if(t.a[i]>MAXN) 122 { 123 t.a[i+1]++; 124 t.a[i]-=MAXN+1; 125 } 126 } 127 if(t.a[big]!=0) 128 t.len=big+1; 129 else t.len=big; 130 return t; 131 } 132 BigNum BigNum::operator-(const BigNum &T)const //两个大数之间的相减运算 133 { 134 int i,j,big; 135 bool flag; 136 BigNum t1,t2; 137 if(*this>T) 138 { 139 t1=*this; 140 t2=T; 141 flag=0; 142 } 143 else 144 { 145 t1 = T; 146 t2 = *this; 147 flag = 1; 148 } 149 big = t1.len; 150 for (i = 0; i<big; i++) 151 { 152 if (t1.a[i]<t2.a[i]) 153 { 154 j = i + 1; 155 while (t1.a[j] == 0) 156 j++; 157 t1.a[j--]--; 158 while (j>i) 159 t1.a[j--] += MAXN; 160 t1.a[i] += MAXN + 1 - t2.a[i]; 161 } 162 else 163 t1.a[i] -= t2.a[i]; 164 } t1.len = big; 165 while (t1.a[t1.len - 1] == 0 && t1.len>1) 166 { 167 t1.len--; 168 big--; 169 } 170 if (flag) 171 t1.a[big - 1] = 0 - t1.a[big - 1]; 172 return t1; 173 } BigNum BigNum::operator*(const BigNum &T)const //两个大数之间的相乘 174 { 175 BigNum ret; 176 int i,j,up; 177 int temp,temp1; 178 for(i=0;i<len;i++) 179 { 180 up=0; 181 for(j=0;j<T.len;j++) 182 { 183 temp=a[i]*T.a[j]+ret.a[i+j]+up; 184 if(temp>MAXN) 185 { 186 temp1=temp-temp/(MAXN+1)*(MAXN+1); 187 up=temp/(MAXN+1); 188 ret.a[i+j]=temp1; 189 } 190 else 191 { 192 up=0; 193 ret.a[i+j]=temp; 194 } 195 } 196 if(up!=0) 197 ret.a[i+j]=up; 198 } 199 ret.len=i+j; 200 while(ret.a[ret.len-1]==0 && ret.len>1)ret.len--; 201 return ret; 202 } 203 BigNum BigNum::operator/(const int &b)const //大数对一个整数进行相除运算 204 { 205 BigNum ret; 206 int i,down=0; 207 for(i=len-1;i>=0;i--) 208 { 209 ret.a[i]=(a[i]+down*(MAXN+1))/b; 210 down=a[i]+down*(MAXN+1)-ret.a[i]*b; 211 } 212 ret.len=len; 213 while(ret.a[ret.len-1]==0 && ret.len>1) 214 ret.len--; 215 return ret; 216 } 217 int BigNum::operator%(const int &b)const //大数对一个 int类型的变量进行取模 218 { 219 int i,d=0; 220 for(i=len-1;i>=0;i--) 221 d=((d*(MAXN+1))%b+a[i])%b; 222 return d; 223 } 224 BigNum BigNum::operator^(const int &n)const //大数的n次方运算 225 { 226 BigNum t,ret(1); 227 int i; 228 if(n<0)exit(-1); 229 if(n==0)return 1; 230 if(n==1)return *this; 231 int m=n; 232 while(m>1) 233 { 234 t=*this; 235 for(i=1;(i<<1)<=m;i<<=1) 236 t=t*t; 237 m-=i; 238 ret=ret*t; 239 if(m==1)ret=ret*(*this); 240 } 241 return ret; 242 } 243 bool BigNum::operator>(const BigNum &T)const //大数和另一个大数的大小比较 244 { 245 int ln; 246 if(len>T.len)return true; 247 else if(len==T.len) 248 { 249 ln=len-1; 250 while(a[ln]==T.a[ln]&&ln>=0) 251 ln--; 252 if(ln>=0 && a[ln]>T.a[ln]) 253 return true; 254 else 255 return false; 256 } 257 else 258 return false; 259 } 260 bool BigNum::operator>(const int &t)const //大数和一个int类型的变量的大小比较 261 { 262 BigNum b(t); 263 return *this>b; 264 } 265 void BigNum::print() //输出大数 266 { 267 int i; 268 printf("%d",a[len-1]); 269 for(i=len-2;i>=0;i--) 270 printf("%04d",a[i]); 271 printf("\n"); 272 } BigNum f[110];//卡特兰数 273 int main() 274 { 275 f[0] = 1; 276 for (int i = 1; i <= 100; i++) 277 f[i] = f[i - 1] * (4 * i - 2) / (i + 1);//卡特兰数递推式 278 int n; 279 while(scanf("%d",&n)==1) 280 { 281 if(n==-1)break; 282 f[n].print(); 283 } 284 return 0; 285 }