Executando verificação de segurança...
2

LikedAndrew, veja se esse material é de seu interesse:
https://www.ime.usp.br/~pf/algoritmos-livro

Concordo com as palavras do maniero

C é a linguagem de alto nível que permite você aprender como tudo funciona do jeito mais básico. Faz você entender melhor qualquer outra linguagem.

Aprender C à medida que também se aprende conceitos sobre algoritmos é um ganho extra. No site indicado é possível baixar o PDF do livro voltado para o ensino de algoritmos. Adota a linguagem C como ferramenta para por em prática o conteúdo.

Outros materiais podem ser encontrados na página deste Prof. da Universidade de São Paulo.


PS: Aproveito para deixar um pequeno programa escrito em C. Mostra três algoritmos que podem ser utilizados para exemplificar o cálculo da raiz quadrada de um número real positivo. Tratam-se meramente de exemplos didáticos, mas algoritmos semelhantes foram muito empregados quando os microprocessadores não contavam com uma FPU (Floating Point Unit) interna ou dispositivo opcional externo. Tudo quanto era função matemática (radiciações, logaritmos, funções trigonométricas, etc.) era realmente implementada em software. No caso do GW-BASIC, por exemplo, eram escritas em Assembly, se não me engano. Ah, em produção nos dias de hoje, adote o sqrt() ou sqrtl() da lib math.h que ela "dá conta" do processo! 8-)

/********************************************************** [ Keep coding! ] */
/*                                                                           */
/* Compile with: gcc -Wall -Wextra -Wpedantic -O2 -o sqrt.e sqrt.c           */
/*****************************************************************************/
#include <stdio.h>

#define TEST_VALUE      2.0
#define EXPECTED_ANSWER 1.41421356237309504880168872420969  /* Powered by BC */


/*****************************************************************************/
/* Purpose   : Function to obtain the absolute value of x                    */
/* Parameters:                                                               */
/*          x: Value of x                                                    */
/* Return    : Absolute value of the input value 'x'                         */
/* ------------------------------------------------------------------------- */
/* LastUpdate: 2024Apr16 - v.0.0.1                                           */
/*****************************************************************************/
double fabs(double x) {
  return (x<0.0)?-x:x;
}

/*****************************************************************************/
/* Purpose   : Function to compute square root using Newton's method         */
/* Parameters:                                                               */
/*          x: input value for which square root needs to be computed        */
/* Return    : Square root of the input value 'x'                            */
/* ------------------------------------------------------------------------- */
/* LastUpdate: 2024Apr16 - v.0.0.1                                           */
/*****************************************************************************/
double newton_square_root(double x) {
    double epsilon = 0.00001;
    double guess = x;
    while (fabs(guess * guess - x) >= epsilon) {
        guess = (guess + x / guess) / 2.0;
    }
    return guess;
}

/*****************************************************************************/
/* Purpose   : Function to compute square root using Binary Search method    */
/* Parameters:                                                               */
/*          x: input value for which square root needs to be computed        */
/* Return    : Square root of the input value 'x'                            */
/* ------------------------------------------------------------------------- */
/* LastUpdate: 2024Apr16 - v.0.0.1                                           */
/*****************************************************************************/
double binary_search_square_root(double x) {
    double low = 0.0;
    double high = x;
    double mid;
    double epsilon = 0.00001;
    while (high - low > epsilon) {
        mid = (low + high) / 2.0;
        if (mid * mid > x) {
            high = mid;
        } else {
            low = mid;
        }
    }
    return low;
}

/*****************************************************************************/
/* Purpose   : Function to compute square root using Babylonian method       */
/* Parameters:                                                               */
/*          x: input value for which square root needs to be computed        */
/* Return    : Square root of the input value 'x'                            */
/* ------------------------------------------------------------------------- */
/* LastUpdate: 2024Apr16 - v.0.0.1                                           */
/*****************************************************************************/
double babylonian_square_root(double x) {
    double guess = x;
    double epsilon = 0.00001;
    while (fabs(guess * guess - x) >= epsilon) {
        guess = 0.5 * (guess + x / guess);
    }
    return guess;
}

/*****************************************************************************/
/* Purpose   : This is the main function                                     */
/* Parameters:                                                               */
/*       none:                                                               */
/* Return    : 0                                                             */
/* ------------------------------------------------------------------------- */
/* Bugs      : unknown                                                       */
/* ToDo      : Improve the first guess value                                 */
/* LastUpdate: 2024Apr16 - v.0.0.1                                           */
/*****************************************************************************/
int main() {
    double x = TEST_VALUE;  /* An input value. */
                            /* Expected answer: 1.41421356237309504 */

    printf("Square root using Newton's method  : %12.8lf\n", \
                                                        newton_square_root(x));
    printf("Square root using binary search    : %12.8lf\n", \
                                                 binary_search_square_root(x));
    printf("Square root using Babylonian method: %12.8lf\n", \
                                                    babylonian_square_root(x));
    printf("Expected value                     : %12.8lf\n", EXPECTED_ANSWER);

    return 0;
}
/***************************************************** [ That's all folks! ] */

Após compilar o programa com o gcc gcc -Wall -Wextra -Wpedantic -O2 -o sqrt.e sqrt.c, basta executá-lo:

$ ./sqrt.e 
Square root using Newton's method  :   1.41421569
Square root using binary search    :   1.41420746
Square root using Babylonian method:   1.41421569
Expected value                     :   1.41421356

NOTA
As funções apresentadas carecem de otimização. Por exemplo, a escolha do chute inicial deve ser melhor explorada para acelerar a convergência da solução, principalmente quando o valor de x tem magnitude elevada. Uma proposta seria atuar diretamente sobre os bits do expoente do número que se encontra armazenado na representação IEEE 754.