php - tabla - divisores de divisores de un número
divisores de un numero para primaria (3)
No estoy seguro de lo que quieres, pero creo que este simple guión puede ayudarte. Avísame si es suficiente o no.
Tratar
function arrayOfDivisors($x) {
$divisors = array ();
for($i = 1; $i < $x; $i ++) {
if ($x % $i == 0) {
$divisors [] = $i;
}
}
return $divisors;
}
$divisors = arrayOfDivisors ( 20 );
var_dump ( $divisors ); // List Divisors
var_dump ( array_sum ( $divisors ) ) // Total
Salida
array
0 => int 1
1 => int 2
2 => int 4
3 => int 5
4 => int 10
int 22 // Total
Si tratamos de encontrar todos los divisores D (array) de un número N, entonces los divisores de cada d en D también se calculan automáticamente en el cálculo de D. ¿Hay alguna manera de que podamos encontrar todos los divisores de un número N? encontrando los divisores de todos sus divisores, y finalmente, resumiéndolos. Obviamente, hay un camino, pero quiero un camino que no tenga cálculos repetitivos. Creo que esto puede hacerse por recursión, pero no entiendo cómo proceder. Estoy proporcionando mi implementación para calcular todos los divisores de un número N. Quiero extenderlo de una manera que, mientras calculo los divisores de N, también calcule los divisores de todos los divisores (y los guarde). Finalmente, puedo sumarlos y obtener lo que quería. Pero en todo el proceso, el punto beneficioso es que también obtuve los divisores de todos los divisores sin ningún esfuerzo adicional (es decir, cálculo repetitivo).
function divisors_of_a_number($n)//returns all the divisors of a number in an unsorted array
{
$i=1;
$s=bcsqrt($n);
while($i<=$s)
{
if(!(bcmod($n,$i)))
{
$a[]=$i;
if($i!=$s)
$a[]=bcdiv($n,$i);
}
++$i;
}
return $a;
}
Aquí hay un ejemplo para aclarar esto: digamos, N es 6. Así que los divisores de N son- {1,2,3,6}. Ahora, ''3'' es un divisor de N. Significa que los números que dividen ''3'' (es decir, sus divisores) también dividirán N. Por lo tanto, podemos decir que los divisores de ''3'' se dividirán N. Del mismo modo, para cada divisor d de N, podemos decir que los divisores de d también son los divisores de N. Entonces, cuando calculamos los divisores para N, calculamos todos los divisores de cada uno de sus divisores d. Quiero una forma en que, al calcular divisores para N = 6, también obtenga los divisores de {1}, {2}, {3} (y los guarde) sin cálculo adicional (porque todos ellos ya están siendo calculados para 6) .
Como ejemplo en vivo, si N = 20, quiero que mi función funcione en el sentido de que devuelve una matriz de matrices. Ahora la matriz externa contiene las claves como los Divisores de 20, es decir, las claves serán {20,10,5,4,2,1}. Ahora, asociado con estas teclas son matrices. Cada una de estas matrices son los divisores de sus respectivas claves. Ahora, si tomo la intersección de los elementos de todos los arreglos internos, obtendré los divisores de 20. Significa que todos los elementos se calculan aunque solo calcule los divisores de 20. Pero, quiero obtener el resultado requerido sin ningún cálculo extra. Cálculo adicional significa que obviamente puedo calcular los divisores de divisores de 20 y devolver el conjunto de matrices. Pero, no quiero hacerlo porque sé que "los divisores de todos los divisores de 20 se calculan a sí mismos mientras que el cálculo de los divisores de 20". Espero que esto aclare todas las cosas.
Aquí está el algoritmo para enumerar los divisores de un número:
y = x + 1 lim -> n
z = (ny)% ((n + y)% n)
si z = 0, y es un divisor de n.
Buena suerte; D
Un acercamiento simple al resultado que le gustaría es primero calcular la factorización prima de su número original, y luego usar esto para enumerar todos los divisores (y todos sus divisores).
Una forma de ver que esto no puede ser más trabajo que cualquier otro enfoque es notar que a partir del resultado que desea es fácil derivar esto (por ejemplo, conoce los factores primos ya que tienen exactamente dos factores, y luego puede verificar si algún poder superior es divisor).