Se ho capito bene dal codice che hai scritto sei ai primi passi. L'idea è praticabile e ti hanno già dato suggerimenti. Ma esistono altri sistemi, uno dei quali è quello delle bisezioni il cui codice accludo sotto. In questa circostanza utilizzare l'algoritmo delle bisezioni è chiaramente un "overkilling" ma penso che sia utile perché puoi utilizzare l'idea per casi più intricati e dove i numeri non sono interi. Come esercizio per i primi passi, una scansione dei valori è chiaramente accettabile ma in pratica è qualcosa che non si fa quasi mai. 
Potresti se ti va e se credi, studiare come funziona il metodo di bisezione e migliorare il codice (non ho controllato il caso di <= rispetto a < e con gli interi si deve sempre fare attenzione) e ti resta nel tuo cassetto un metodo nuovo da usare in altri casi.
L'esercizio che devi svolgere è molto didattico perché consente anche una soluzione diretta, ed è quello che si cerca sempre di fare quando la matematica si fa dura. Una soluzione in forma chiusa è sempre meglio di una numerica. Quindi in ordine di efficacia hai: 1) scansione di intervallo di valori, eventualmente migliorabile con una stima del punto iniziale 2) Metodo numerico come quello delle bisezioni che vedi sotto 3) Forma chiusa. Puoi anche portargli tutte e tre le soluzioni 
#include   <stdio.h>
#include   <stdlib.h>
/*
 *   funzione obiettivo:
 *
 *   x * x < y si scrive (e si codifica) come
 *
 *   FUN = x * x - y
 */
long       function (long  xval, long  yval)
{
    return ( xval * xval - yval ) ;
}
void     make_iter (int    *a_iter  ,
                    long   *a_res   ,
                    long   a_x1     ,
                    long   a_x2     )
{
    ++(*a_iter) ;
    (*a_res) = ( a_x1 + a_x2 ) / 2 ;
    printf("iterazione %4d  xnext = %4ld\n",(*a_iter),(*a_res)) ;
}
int        main ()
{
    int         iter_no =  0 ;
    int         maxmitr = 20 ;
    long        xval         ;
    long        yval         ;
    long        a_inf        ;
    long        b_sup        ;
    long        allowed_err  ;
    long        xnext        ;
    yval  =  144  ;  // valore dato
    xval  =    0  ;  // valore di partenza
    a_inf =    0  ;  // intervallo in cui cercare
    b_sup = 2000  ;
    allowed_err = 1 ;
    // mostra situazione iniziale
    make_iter (&iter_no,&xval,a_inf,b_sup) ;
    // esegui
    do
    {
        if(   function(a_inf,yval) * function(xval,yval) < 0   )
        {
            b_sup = xval ;
        }
        else
        {
            a_inf = xval ;
        }
        make_iter (&iter_no,&xnext,a_inf,b_sup) ;
        if(  abs((int)xnext-(int)xval) < allowed_err  )
        {
            printf("\niterazioni %4d  valore cercato = %d\n",iter_no,xnext) ;
            return (0) ;
        }
        xval = xnext ;
    }
    while( iter_no < maxmitr ) ;
    printf("procedura non converge o troppe iterazioni");
    return (1) ;
}