void shrink(char *n, char *a, char *b, char **pa, char **pb) { char *sum = add_in(a, b); char **r = divide_strings_in(sum, "2"); char *mid = r[0]; char *mid2 = multiply_in(mid, mid); int cmp = compare(mid2, n); free(sum); free(r[1]); free(r); free(mid2); if (cmp == 0) { *pa = *pb = mid; free(a); free(b); return; } else if (cmp > 0) { *pa = a; *pb = mid; free(b); return; } else { *pa = mid; *pb = b; free(a); return; } }
NODE *addpts(NODE * zero, int r, int c, int rr, int cc, int *node_ct) { NODE *add_in(); if (rr < nrows - 1) { if (!flag_get(seen, rr + 1, cc)) zero = add_in(r, c, rr + 1, cc, zero, node_ct); } if (cc < ncols - 1) { if (!flag_get(seen, rr, cc + 1)) zero = add_in(r, c, rr, cc + 1, zero, node_ct); } if (rr > 0) { if (!flag_get(seen, rr - 1, cc)) zero = add_in(r, c, rr - 1, cc, zero, node_ct); } if (cc > 0) { if (!flag_get(seen, rr, cc - 1)) zero = add_in(r, c, rr, cc - 1, zero, node_ct); } return (zero); }
char *sqrt_string_in(char *n) { char *b = strdup("0"); char *e = bound(n); while (1) { shrink(n, b, e, &b, &e); char *sum = add_in(b, "1"); bool cmp = compare(b, e) <= 0 && compare(sum, e) >= 0; free(sum); if (cmp) { if (b != e) { free(e); } return b; } } }