Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

guiobom131

Scripts úteis

Recommended Posts

<?

/* FUNÇÕES:

-> strtodec($str);

-> dectostr($valor);

-> mdc ($num1, $num);

-> mmc ($string);

-> simp_fr ($n, $d);

-> soma_fr ($n1, $d1, $n2, $d2);

-> dif_fr ($n1, $d1, $n2, $d2);

-> mult_fr ($n1, $d1, $n2, $d2);

-> div_fr ($n1, $d1, $n2, $d2);

-> fatora($num);

-> num_div($num);

-> divisores($num);

-> par_div($num);

-> is_quad($num);

-> dectorom($dec);

-> romtodec($rom);

*/

 

/* Conjunto de funções que trabalham com o cálculo com letras (a=0, b=1, c=2, etc...)*/

function strtodec ($str="a") {

// Sepeara os caracteres da string

for ($i=0; $i<strlen($str); $i++) {

$char[] = strtolower(substr($str, $i, 1));

}

// Transforma letra em número

$letras = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");

foreach($char as $elemento) {

for ($i=0; $i<count($letras); $i++) {

if ($elemento == $letras[$i])

break;

}

$num[] = $i;

}

// Calcula e retorna o valor

for ($i=0; $i<count($num); $i++) {

$expoente = count($num)-1-$i;

$mult = pow(26, $expoente);

$valor += $num[$i]*$mult;

}

return $valor;

}

function dectostr($valor=0) {

// Cria uma array com os valores de cada casa

if ($valor<26) $num[0]=$valor;

while($valor>25) {

$quociente = floor($valor/26);

$resto = $valor%26;

$num[] = $resto;

if ($quociente<26) {

$num[] = $quociente;

break;

}

$valor = $quociente;

}

// Transforma os números em letras, junta-os e retorna

$num = array_reverse($num);

$letras = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");

$str = "";

foreach($num as $elemento) {

$str .= $letras[$elemento];

}

return $str;

}

/* As duas funções acima servem para trabalhar com base 26, ex:

a+a = 0+0 = 0 = a

g+u+i = 6+19+8 = 33 = bh

gui = gaa+ua+i = 4056+520+8 = 4584

b*c = 1*2 = 2 = c

f/b = 5/1 = 5 = f

z-a = 25-0 = 25 = z

z+b = 25+1 = 26 = ba

bh-ba = 33-26 = 7 = h

*/

// Calcula o mdc de dois números

function mdc ($num1, $num2) {

$D = max($num1, $num2);

$r = min($num1, $num2);

while ($r != 0) {

$d = $D;

$D = $r;

$r = $d%$D;

}

return $D;

}

// Calcula o mmc das números organizados em string:

// "n1-n2-n3-n4-...-nn"

function mmc ($string) {

$num = explode("-", $string);

$i = 1;

$r = 1;

while (array_sum($num) != count($num)) {

$i++;

$multiplo = false;

for ($j=0; $j<count($num); $j++) {

if ($num[$j]%$i == 0) {

$multiplo = true;

$num[$j] /= $i;

}

}

if ($multiplo) {

$r *= $i;

$i--;

}

}

return $r;

}

/* Simplifica uma fração, a função deve ser chamada assim:

simp_fr($numerado, $denominador) e retorna

"$numerador/$denominador"*/

function simp_fr ($n, $d) {

// Transforma o denominador em inteiro

$temp = strlen($d)-strlen(floor($d));

$multi = pow(10, $temp);

$d *= $multi;

$n *= $multi;

// Transforma o numerador em inteiro

$temp = strlen($n)-strlen(floor($n));

$multi = pow(10, $temp);

$d *= $multi;

$n *= $multi;

// Calcula o mdc através da função mdc

$mdc = mdc(abs($n), abs($d));

// Aplica o mdc

$n /= $mdc;

$d /= $mdc;

// Transforma o sinal

if ($d != abs($d)) {

$d = -$d;

$n = -$n;

}

// Retorna o resultado

return $n . "/" . $d;

}

/* Soma duas frções, chame a função assim:

soma_fr ($numerador1, $denominador1, $numerador2, $denominador2);

retorna "$numerador/$denominador"*/

function soma_fr ($n1, $d1=1, $n2, $d2=1) {

// Simplifica as duas frações

$fr1 = simp_fr($n1, $d1);

$fr2 = simp_fr($n2, $d2);

$temp = explode("/", $fr1);

$n1 = $temp[0];

$d1 = $temp[1];

$temp = explode("/", $fr2);

$n2 = $temp[0];

$d2 = $temp[1];

// Calcula o mmc e reduz ao mesmo denominador

$mmc = mmc("$d1-$d2");

$n1 *= $mmc/$d1;

$n2 *= $mmc/$d2;

$d = $mmc;

$n = $n1+$n2;

// Simplifica o resultado e retorna

return simp_fr($n, $d);

}

/* Subtrai duas frções, chame a função assim:

dif_fr ($numerador1, $denominador1, $numerador2, $denominador2);

retorna "$numerador/$denominador"*/

function dif_fr ($n1, $d1=1, $n2, $d2=1) {

// Simplifica as duas frações

$fr1 = simp_fr($n1, $d1);

$fr2 = simp_fr($n2, $d2);

$temp = explode("/", $fr1);

$n1 = $temp[0];

$d1 = $temp[1];

$temp = explode("/", $fr2);

$n2 = $temp[0];

$d2 = $temp[1];

// Calcula o mmc e reduz ao mesmo denominador

$mmc = mmc("$d1-$d2");

$n1 *= $mmc/$d1;

$n2 *= $mmc/$d2;

$d = $mmc;

$n = $n1-$n2;

// Simplifica o resultado e retorna

return simp_fr($n, $d);

}

/* Função que multiplica duas frações, chame-a assim:

mult_fr ($numerador1, $denominador1, $numerador2, $denominador2);

retona "$numerador/$denominador"*/

function mult_fr ($n1, $d1=1, $n2, $d2=1) {

// Simplifica as duas frações

$fr1 = simp_fr($n1, $d1);

$fr2 = simp_fr($n2, $d2);

$temp = explode("/", $fr1);

$n1 = $temp[0];

$d1 = $temp[1];

$temp = explode("/", $fr2);

$n2 = $temp[0];

$d2 = $temp[1];

// Multiplica os numeradores e denominadores

$n = $n1*$n2;

$d = $d1*$d2;

// Simplifica e retorna o resultado

return simp_fr($n, $d);

}

/* Função que divide duas frações, chame-a assim:

div_fr ($numerador1, $denominador1, $numerador2, $denominador2);

retona "$numerador/$denominador"*/

function div_fr ($n1, $d1=1, $n2, $d2=1) {

// Inverte, multiplica e retorna o resultado

return mult_fr($n1, $d1, $d2, $n2);

}

// Fatora um número natural e retorna "base1-expoente1-base2-expoente2...-basen-expoenten"

// Ex.: fatora(12) retorna "2-2-3-1" que significa que 12 = 2²*3¹ (dois ao quadrado vezes 3)

function fatora($num) {

$i = 1;

$ant = 1;

if ($num == 1) {

return "1-1";

} else if ($num == 0) {

return "0-1";

}

while($num != 1) {

$i++;

if ($num%$i == 0) {

if ($i == $ant) {

$exp[count($exp)-1]++;

} else {

$exp[] = 1;

$bases[] = $i;

}

$num /= $i;

$ant = $i;

$i--;

}

}

// Transforma as arrays em strings

for ($i=0; $i<count($exp); $i++) {

$result .= $bases[$i] . "-" . $exp[$i] . "-";

}

$result = substr($result, 0, strlen($result)-1);

return $result;

}

// Calcula o número de divisores positivos de um número natural

function num_div ($num) {

$fatores = fatora($num);

$fatores = explode("-", $fatores);

$result = 1;

for ($i=1; $i<count($fatores); $i+=2) {

$result *= $fatores[$i]+1;

}

return $result;

}

// Determina todos os divisores positivos de um natural e retorna "div1-div2-div3...-divn"

// Ex.: divisores(12) -> "1-2-3-4-6-12"

function divisores($num) {

$fatora = fatora($num);

$fatora = explode("-", $fatora);

for ($i=1; $i<count($fatora); $i+=2) {

for ($j=0; $j<$fatora[$i]; $j++) {

$fatores[] = $fatora[$i-1];

}

}

$divisores = array(1, $fatores[0]);

$ant = $fatores[0];

$nant = 1;

for ($i=1; $i<count($fatores); $i++) {

$atu = $fatores[$i];

if ($ant == $atu) {

$inicio = count($divisores)-$nant;

} else {

$inicio = 0;

}

$fim = count($divisores);

$nant = $fim-$inicio;

for ($j=$inicio; $j<$fim; $j++) {

$divisores[] = $divisores[$j]*$atu;

}

$ant = $atu;

}

sort($divisores);

$result = join("-", $divisores);

return $result;

}

// Retorna uma array com os pares de divisores que multiplicados deêm o número

// Ex.: par_div(12) -> array("1-12", "2-6", "3-4")

// Ex2.: par_div(16) -> array("1-16", "2-8", "4-4")

function par_div ($num) {

$divisores = divisores($num);

$divisores = explode("-", $divisores);

$max = count($divisores)%2==0 ? count($divisores)/2 : (count($divisores)+1)/2;

for ($i=0; $i<$max; $i++) {

$result[] = $divisores[$i] . "-" . $divisores[count($divisores)-$i-1];

}

return $result;

}

// Determina se um natural é quadrado perfeito

function is_quad ($num) {

if (num_div($num)%2 == 0) {

return "false";

} else {

return "true";

}

}

// Transforma um número natural em número romano

function dectorom ($dec) {

if ($dec<0) {

return '';

}

$dec = (int) $dec;

$digit = (int) ($dec / 1000);

$dec -= $digit * 1000;

while ($digit > 0) {

$rom .= 'M';

$digit--;

}

$a = array("I", "X", "C", "M");

$b = array("V", "L", "D");

$c = array("", "a", "aa", "aaa", "ab", "b", "ba", "baa", "baaa", "ac");

for ($i=0; $i<strlen($dec); $i++) {

$j = strlen($dec)-$i-1;

$va = $a[$j];

$vb = $b[$j];

$você = $a[$j+1];

$trans = array("a" => $va, "b" => $vb, "c" => $você);

$str = $c[substr($dec, $i, 1)];

$rom .= strtr($str, $trans);

}

return $rom;

}

// Transforma um número romano em natural

function romtodec ($rom) {

$rom = strtoupper($rom);

$trans = array("M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1);

$anterior = 1001;

for ($i=0; $i<strlen($rom); $i++) {

$atual = strtr(substr($rom, $i, 1), $trans);

if ($atual>$anterior) {

$dec -= 2*$anterior;

}

$dec += $atual;

$anterior = $atual;

}

return $dec;

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito interesse, só achei que você deveria dar uns espaços entre as funções do novo código pq as vzs confunde onde termina um e começa outro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.