// 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); } }
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; }
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; }