hdu 1041 (OO approach, private constructor to prevent instantiation, sprintf)

a problem where OO seems more natural to me, implementing a utility class not instantiable.
how to prevent instantiation, thanks to http://stackoverflow.com/questions/10558393/prevent-instantiation-of-an-object-outside-its-factory-method/10558404#10558404

#include <cstdio>
#include <algorithm>

class CompTrans {
    CompTrans() { }
    static const unsigned NUMS_LEN=240000, MAX_NUM=1000, BASE=1000000000;
    static bool isinitialized;
    static char nums[NUMS_LEN];
    static char* pos[MAX_NUM+2];
public:
    static bool isinited() { return isinitialized; }
    static void init();
    static void printnth(unsigned n) { puts(pos[n]); }
    static unsigned getMAX_NUM() { return MAX_NUM; }
};
bool CompTrans::isinitialized=false;
char CompTrans::nums[];
char* CompTrans::pos[];
void CompTrans::init() {
    if(isinited()) return;
    int i,j,k;
    char *p=nums;
    const int NSIZE=40;
    unsigned n1[NSIZE]={0}, n2[NSIZE]={1}, n3[NSIZE]={0},tmp, *p1,*p2,*p3,*ptmp, carry;
    p1=n1,p2=n2,p3=n3;
    for(k=0, i=1;i<=MAX_NUM;++i) {
        pos[i]=p;
        p+=sprintf(p,"%u",p1[k]);
        for(j=k-1;j>=0;--j) p+=sprintf(p,"%09u",p1[j]);
        *p++=0;
        if(p2[k+1]!=0) ++k;
        for(carry=0, j=0;j<=k;++j) {
            tmp=carry+p2[j]+(p1[j]<<1);
            carry=tmp/BASE;
            p3[j]=tmp%BASE;
        }
        p3[j]=carry;
        ptmp=p1; p1=p2; p2=p3; p3=ptmp;
    }
    isinitialized=true;
}

int main() {
    //freopen("input.txt","r",stdin);
    int n;
    if(!CompTrans::isinited()) CompTrans::init();
    while(scanf("%d",&n)!=EOF && n<=CompTrans::getMAX_NUM()) {
        CompTrans::printnth(n);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值