Função "Partição de Inteiros" Recursiva SEM Tabela Estática em C

De quantos modos diferentes pode-se escrever 6 como soma de números maiores que zero? 6 = 5+1 = 4+2 = 3+3 = 4+1+1 = 3+2+1 = 2+2+2 = 3+1+1+1 = 2+2+1+1 = 2+1+1+1+1 = 1+1+1+1+1+1 11 modos diferentes. p(6) = 11. O cálculo do número de partições de um inteiro usa uma recursão bem mais demorada que a dos números de Fibonacci ou a fatorial. Este exemplo usa a recursão pura e simples sem armazenar os valores já calculados, necessitando de um novo cálculo a cada chamada. Isto porque pelo método de recursão, ela pode ter a necessidade de calcular valores anteriormente calculados. Quanto maior o valor requerido, maior o tempo. Quem não tiver saco de esperar a eternidade de cálculo para os valores deste código, sugiro modificar para um tempo que não seja tão cansativa a demora. Parte dos resultados pode ser conferida neste link: http://oeis.org/A000041

Por: Perfil removido


Função "Temporizador" em C

Exemplo simples em compilação normal. A função lê um instante do sistema e divide o valor pelo número de ciclos de execução da máquina para calcular tempo. Depois faz isto por uma segunda vez dentro de um laço (loop). Quando a diferença entre a segunda e a primeira leitura for igual a um valor fornecido em segundos à função, o loop se encerra e a função termina. Deste modo, durante a execução da função passou-se este tempo em segundos. Igual à sleep em Bash.

Por: Perfil removido


Cálculo de logaritmo de um número por um terceiro método em C

Este é um terceiro método de cálculo de logaritmos e o curioso é que sempre são necessários os mesmos números de passos para o cálculo. Bem diferente do que cito como métodos "A" e "B". Não é nada inovador e é do tipo de coisa vista num curso escolar sobre a matéria. Detalhes no código. Não precisa de derivadas. Apenas saber raiz quadrada. O que significa que dá prá fazer com o auxílio de uma calculadora do tipo que não é científica e algumas anotações caso esta calculadora tenha restrição de memória. Portanto a precisão e o custo computacional estão ligados diretamente ao algoritmo de raiz quadrada usado. Ele usa o mesmo método quese usa para saber quantas casas decimais ou quantos bits tem um número. Ao se escrever um número de binário para decimal, são usadas somas de potências de 2 e *** qualquer número é uma soma de potências não-repetidas de 2. Como se faz mesmo? Divide-se por 2 repetidas vezes e anotam-se os restos, 0 e 1 alternados que serão os dígitos de escrita. Por exemplo: 32 = 2 elevado à 5. São feitas 5 divisões por 2. Por acaso esse 5 é o expoente e o logaritmo. Para 33 = 2 elevado à 5. mais 1. A diferença é que sobrou 1. Se a parte inteira desse logaritmo de 33 base 2 é 5 e pôde ser calculada, então não existiria algo a ser feito com esse 1 que sobrou prá saber qual é o logaritmo de 33 base 2 fracionado? A resposta é sim. Numa divisão, divisão mesmo, quando o resto é maior que o número prá se dividir, coloca-se a vírgula e vão sendo colocados zeros quando não se consegue dividir. Se o objetivo era o de descobrir quantos 2 existiam dentro de 33, agora esse objetivo deve ser mudado porque 2 já não é possível com o resto 1. Agora deve-se descobrir quantas "raiz quadradas de 2" existem neste resto. Dividir o resto por sqrt(2) quantas vezes for possível, contar quantas divisões foram feitas e colocar após a vírgula colocada após o cinco. E quando o resto for de novo menor que o teste, que é "raiz quadrada de 2", muda se de novo o teste. Muda-se para "raiz quadrada da raiz quadrada" de dois. Também chamada de a "raiz quarta". Faz-se a mesma coisa: contam-se o número de divisões e anota-se na casa decimal seguinte à da última contagem. O único problema é que este método depende do sistema de numeração adotado. Esse exemplo citado acima foi para base 2. Para fazer com base 10, precisa trabalhar com "raiz décima". E agora? Da mesma forma que inteiros são representados por somas de potências de dois, fracionários também podem ser representados. Representados por somas de potências de 0.5 (ou 1/2). Ficaria a sequência: 1/2, 1/4, 1/8, 1/16, 1/32... 1/2 = 0.1 binário 1/4 = 0.01 binário 1/8 = 0.001 binário 1/16 = 0.0001 binário 1/32 = 0.00001 binário Da mesma forma que existem decimais de casas infinitas, existiriam binários de casas infinitas. No caso do teste de divisão existiriam duas hipóteses: "dá prá dividir" o resultado da divisão é 1 "não dá prá dividir" o resultado da divisão é 0 Sempre havendo resto. Se fosse prá escrever em binário de baixo nível na memória, bastava deslocar uma casa tipo "x >> 1" em ponto flutuante e inverter o bit, mas parece que em C não há como e ainda não me inteirei do que poderia ser feito. Ainda. Então o jeito é somar potências de (1/2) decimais numa variável conforme o resultado da divisão seja 0 ou 1. O expoente da potência somada corresponde à casa fracionária binária. Fiquem à vontade para sugestões, dúvidas ou apontar erros e simplificações.

Por: Perfil removido


Cálculo de logaritmo de um número por Método de Newton-Raphson em C

A descrição vai ao código. Este método, também como o algoritmo "A", necessita da definição do que é uma derivada. Ele é bem mais simples de implementar que Séries de Taylor e possui um custo computacional bem menor também. O problema é a necessidade de um valor inicial, que é aproximado a cada iteração. Deste valor depende a veloidade de mais ou menos iterações. Grosseiramente o método funciona por uma fórmula F(x) onde se começa com o valor x0. Depois continua-se com x1=F(x0) e segue: x2=F(x1) x3=F(x2) x4=F(x3) ... Até o último valor x_ obtido ser muito igual com o último valor x_ que entrou. Para saber como é essa fórmula F(X) é que é necessário saber algo de derivadas. Qualquer erro encontrado ou dúvida, fiquem à vontade.

Por: Perfil removido


Cálculo de logaritmo de um número por Série de Taylor em C

A descrição vai ao código. Ainda não sei um modo simples de dizer o que seria uma derivada, que é algo a ser usado neste algoritmo. O que faz parte da teoria sobre Séries de Taylor. Portanto entender a fórmula da Série não é o problema, mas o porquê de ter sido escrita daquela forma. Existe uma fórmula T(x) chamada de "Termo Geral". Calcula-se um valor para cada número natural (0, 1, 2, 3 ... ) inteiros não-negativos nessa fórmula em ordem crescente Os valores são somados de forma acumulativa: T(0) + T(1) + T(2) + T(3) + ... Quanto mais se calcule e se soma, maior a precisão. Porém demora bastante. O custo computacional é maior que o de outros métodos. Requer muitos passos para um resultado preciso. Para se entender como foi feita essa fórmula de termo geral T(x) é que se precisa saber derivadas. Qualquer erro encontrado ou dúvida, fiquem à vontade.

Por: Perfil removido


Joguinho de labirinto usando as setas do teclado

Esse é um joguinho de labirinto. Originalmente escrito por < Tiago Negri >, modificado por < Luís Fred > e agora melhorado pro mim. Agora o jogo usa as setas do teclado.

Por: Denilson






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts