HDOJ 1134 数学+大数
这个题是卡特兰数的公式题
不需要讲太多的东西,关键是贴个大数的模板
bin神的模板改造过来
bin神的思路是一个int值保存一个整数的4个数位
其实在模拟题中,如果内存够的话,保存1个数位是更好处理的,因为可以更好的判断首位和末位的情况
改动如下:
把private的a数组和len值改为public的(不然在BigNum的定义外面没有访问的权限)
把DLEN改为1
把MAXN改为9
然后注意,istream和ostream其实可以不需要(因为可以先读取字符串,然后在转化成BigNum)
在print()函数中
要把%04d改为%0d,因为现在一位中只有一个数字了
#include<bits/stdc++.h>
using namespace std;
#define MAXN 9
#define MAXSIZE 1010
#define DLEN 1
class BigNum{
public:
int a[MAXSIZE];
int len;
BigNum(){len=1;memset(a,0,sizeof(a));}
BigNum(const int);
BigNum(const char *);
BigNum(const BigNum &);
BigNum & operator = (const BigNum &);
friend istream & operator >> (istream &,BigNum &);
friend ostream & operator << (ostream &,BigNum &);
BigNum operator + (const BigNum &) const;
BigNum operator - (const BigNum &) const;
BigNum operator * (const BigNum &) const;
BigNum operator / (const int &) const;
BigNum operator ^ (const int &) const;
int operator % (const int &) const;
bool operator > (const BigNum &T) const;
bool operator > (const int &t) const;
void print();
};
BigNum::BigNum(const int b){
int c,d=b;
len=0;
memset(a,0,sizeof(a));
while(d>MAXN){
c=d-(d/(MAXN+1))*(MAXN+1);
d=d/(MAXN+1);
a[len++]=c;
}
a[len++]=d;
}
BigNum::BigNum(const char *s){
int t,k,index,L,i;
memset(a,0,sizeof(a));
L=strlen(s);
len=L/DLEN;
if (L%DLEN) len++;
index=0;
for(i=L-1;i>=0;i-=DLEN){
t=0;
k=i-DLEN+1;
if (k<0) k=0;
for(int j=k;j<=i;j++)
t=t*10+s[j]-'0';
a[index++]=t;
}
}
BigNum::BigNum(const BigNum &T):len(T.len){
memset(a,0,sizeof(a));
for(int i=0;i<len;i++) a[i]=T.a[i];
}
BigNum & BigNum::operator = (const BigNum &n){
len=n.len;
memset(a,0,sizeof(a));
for(int i=0;i<len;i++) a[i]=n.a[i];
return *this;
}
BigNum BigNum::operator + (const BigNum &T) const{
BigNum t(*this);
int i,big;
big=T.len>len?T.len:len;
for(i=0;i<big;i++){
t.a[i]+=T.a[i];
if (t.a[i]>MAXN){
t.a[i+1]++;
t.a[i]-=MAXN+1;
}
}
if (t.a[big]!=0) t.len=big+1;
else t.len=big;
return t;
}
BigNum BigNum::operator - (const BigNum &T) const{
int i,j,big;
bool flag;
BigNum t1,t2;
if (*this>T){
t1=*this;
t2=T;
flag=0;
}
else{
t1=T;
t2=*this;
flag=1;
}
big=t1.len;
for(i=0;i<big;i++){
if (t1.a[i]<t2.a[i]){
j=i+1;
while(t1.a[j]==0) j++;
t1.a[j--]--;
while(j>i) t1.a[j--]+=MAXN;
t1.a[i]+=MAXN+1-t2.a[i];
}
else t1.a[i]-=t2.a[i];
}
t1.len=big;
while(t1.a[t1.len-1]==0&&t1.len>1){
t1.len--;
big--;
}
if (flag)
t1.a[big-1]=0-t1.a[big-1];
return t1;
}
BigNum BigNum::operator * (const BigNum &T) const{
BigNum ret;
int i,j,up;
int temp,temp1;
for(i=0;i<len;i++){
up=0;
for(j=0;j<T.len;j++){
temp=a[i]*T.a[j]+ret.a[i+j]+up;
if (temp>=MAXN){
temp1=temp-temp/(MAXN+1)*(MAXN+1);
up=temp/(MAXN+1);
ret.a[i+j]=temp1;
}
else{
up=0;
ret.a[i+j]=temp;
}
}
if (up) ret.a[i+j]=up;
}
ret.len=i+j;
while(ret.a[ret.len-1]==0&&ret.len>1) ret.len--;
return ret;
}
BigNum BigNum::operator / (const int &b) const{
BigNum ret;
int i,down=0;
for(i=len-1;i>=0;i--){
ret.a[i]=(a[i]+down*(MAXN+1))/b;
down=a[i]+down*(MAXN+1)-ret.a[i]*b;
}
ret.len=len;
while(ret.a[ret.len-1]==0&&ret.len>1) ret.len--;
return ret;
}
int BigNum::operator % (const int &b) const{
int i,d=0;
for(i=len-1;i>=0;i--)
d=((d*(MAXN+1))%b+a[i])%b;
return d;
}
BigNum BigNum::operator ^ (const int &n) const{
BigNum t,ret(1);
int i;
if (n<0) exit(-1);
if (n==0) return 1;
if (n==1) return *this;
int m=n;
while(m>1){
t=*this;
for(i=1;(i<<1)<=m;i<<=1) t=t*t;
m-=i;
ret=ret*t;
if (m==1) ret=ret*(*this);
}
return ret;
}
bool BigNum::operator > (const BigNum &T) const{
int ln;
if (len>T.len) return true;
else if (len==T.len){
ln=len-1;
while(a[ln]==T.a[ln]&&ln>=0) ln--;
if (ln>=0&&a[ln]>T.a[ln]) return true;
else return false;
}
else return false;
}
bool BigNum::operator > (const int &t) const{
BigNum b(t);
return *this>b;
}
void BigNum::print(){
printf("%d",a[len-1]);
for(int i=len-2;i>=0;i--) printf("%0d",a[i]);
printf("\n");
}
BigNum x,y,z;
char s[MAXSIZE];
BigNum ans[150];
int main(){
/*
freopen("input.txt","r",stdin);
scanf("%s",s);
x=BigNum(s);
scanf("%s",s);
y=BigNum(s);
y.print();
z=x^3;
z.print();
z=x+y;
z.print();
z=x-y;
z.print();
z=x*y;
z.print();
printf("%d\n",x%100);
z=y/100;
z.print();
if (x>y) printf("x>y\n");
else printf("x<y\n");
*/
int n;
ans[0]=1;
for(int i=1;i<=100;i++)
ans[i]=ans[i-1]*(4*i-2)/(i+1);
while(scanf("%d",&n)!=EOF){
if (n==-1) break;
ans[n].print();
}
return 0;
}