bool isAdditiveNumber(char * num){
    int i, j, k, len=strlen(num), pst1=0, pst2=0, bit=0, third;
    char* tmp1=(char*)calloc(22,sizeof(char));
    char* tmp2=(char*)calloc(22,sizeof(char));
    char* tmp3=(char*)calloc(22,sizeof(char));
    for (i=1; i<=len/2; i++){
        if(i>1 && num[0]=='0')
                break;        
        for (j=i+1; j<len && j-i<=len/2; j++){
            memset(tmp1,0x30,21);
            memcpy(tmp1+21-i,num,i*sizeof(char));
            if(j-i>1 && num[i]=='0')
                break;
            memset(tmp2,0x30,21);
            memcpy(tmp2+21-(j-i),num+i,(j-i)*sizeof(char));
            third=j;
            pst2=( 21-(j-i) < 21-i )?21-(j-i) :21-i;
            while(third<len){
                memset(tmp3,0x30,21);
                for (k=20; k>=pst2-1; k--){                
                    tmp3[k] += (tmp1[k]-'0'+tmp2[k]-'0'+bit)%10;
                    bit=(tmp1[k]-'0'+tmp2[k]-'0' +bit >= 10)?1 :0;
                }
                while(k<20 && tmp3[k]=='0')
                    k++;
                if(strncmp(tmp3+k,num+third,20-k+1) == 0){                
                    char* p=tmp1;
                    tmp1=tmp2;
                    tmp2=tmp3;
                    tmp3=p;                    
                    third+=20-k+1;
                    pst2=k;
                }
                else
                    break;
            }
            if(third==len)
                return true;            
        }
    }
    return false;
}