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

来源:互联网 发布:战翼468长板淘宝 编辑:程序博客网 时间:2024/06/06 02:17

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
原创粉丝点击