// Simple workhorse function uses recursion to create the expressions that are possible with 3^^(n-1) possibilities
void recSearch(long long * presult, long long * pstack, char * digStr, char negflag)
{
//    printf("pr = %p, *pr = %lld, ps = %p, *ps = %lld, nf = %d str = %s\n",
//           presult, *presult, pstack, *pstack, negflag, digStr);
//    printf("res = %lld, stk = %lld, nf = %d str = %s",
//            *presult, *pstack, negflag, digStr);
    
    // if we're done building the string -- check ugly
    if(*digStr == '\n'){
        long long result = *presult + (negflag ? -(*pstack) : *pstack);
        if(
            //  == % 2 ?
            ((result & 0x01) == 0) ||
            (result % 3 == 0) ||
            (result % 5 == 0) ||
            (result % 7 == 0)
          ) {
            
            uglycount++;
        }
    }
    // otherwise continue building the string with insertions of -, + or nothing (which means x10)
    else {
        // stack = stack * 10 + ((long long) (*digStr - '0'));
        long long stack = (*pstack << 1);
        stack += (stack << 2) + ((long long)(*digStr & 0x0f) );
        recSearch(presult, &stack, digStr+1, negflag);
        
        long long resultx = *presult + (negflag ? -*pstack : *pstack);
        long long stackx = (long long) (digStr[0] & 0x0f);
//        printf("%c %lld\n", negflag ? '-' : '+', resultx);
        recSearch(&resultx, &stackx, digStr+1, 1);
        recSearch(&resultx, &stackx, digStr+1, 0);
    }
}
Exemple #2
0
int search(rect *r, RTree *t, int **resp){
    int offset = 0;
    int size_resp = 100;
    *resp= (int *) malloc(size_resp * sizeof(int));
    if(t->root == NULL)
        return 0;
    int i;
    recSearch(r, t->root, resp, &offset, size_resp);
    return offset;
}
Exemple #3
0
void recSearch(rect *r, node *n, int **resp, int *offset, int size_resp){
    int i;
    node *n1;

    if(n->leaf){
        for(i = 0; i < n->size; ++i){
            if(intersect(r, n->values[i]->r)){
                if(*offset == size_resp)
                    size_resp = dupResp(resp, size_resp);
                (*resp)[(*offset)++] = n->values[i]->child;
            }
        }
        return;
    }

    for(i = 0; i < n->size; ++i){
        if(intersect(r, n->values[i]->r)){
            n1 = readNode(n->values[i]->child);
            recSearch(r, n1, resp, offset, size_resp);
            freeNode(n1);
        }
    }
}
int main(int argc, const char * argv[])
{
    
    FILE *file = fopen(argv[1], "r");
    char digitsStr[1024];
    long long stack;
    long long result;

    
    while(fgets(digitsStr, 1024, file)) {
        // if desired ... insert check that the input string length <= 13 and is only number chars
        // set ugly count to zero
        uglycount = 0;
        result = 0;
        stack = (long long) (digitsStr[0] & 0x0f);
//       printf("INPUT: %s", digitsStr);
        recSearch( &result, &stack, &digitsStr[1], 0);
//        digitsStr[strlen(digitsStr) - 1] = '\0';
//        printf ("Input Value (%s) is %lld time(s) ugly.\n",digitsStr, uglycount);
        printf("%lld\n", uglycount);
    }
    
    return 0;
}