¿Cuál es la mejor manera de encontrar números amistosos hasta N?

// corrígeme si estoy equivocado, pero no son números amigables 2-tuplas cuya // suma de divisores es igual al otro número, por lo que no puede ser hasta n,
// tiene que haber dos límites, uno para el primer elemento y otro para el
// segundo elemento.
// Entonces, esta pregunta podría expresarse mejor como los números amistosos hasta
//Minnesota
// El siguiente código está escrito en C99.
int get_sum_of_divisors (int num) {
int suma = 0;
para (int i = 1; i <num; i ++) / * vamos por menos que porque no queremos el número en sí * / {
if ((num% i) == 0) {
suma + = i;
}
}
suma de retorno;
}
nulo amicable_nums (int n, int m) {
int i = 1;
int j = 1;
mientras que (j <m) {
mientras que (i <n) {
si (i == j) {
i ++;
continuar;
} más {
int a = get_sum_of_divisors (i);
int b = get_sum_of_divisors (j);
if (a == j && b == i) {
printf (“% d y% d \ n”, i, j);
i ++;
continuar;
}
}
}
j ++;
}
}

El código es bastante sencillo y fácil de entender (porque podría escribirlo jajaja). El análisis de la complejidad temporal del algoritmo es [matemática] \ sum_ {i = 0} ^ {m} O (n ^ 2). [/ Matemática]

Es O (n ^ 2) porque cada vez, verifica los divisores que suceden en [math] \ sum_ {i = 0} ^ {num} O (1) [/ math] y el total se evalúa como O (1) + O (1) …… = O (n).

Eso evalúa aproximadamente a O (n ^ 3) como un análisis de complejidad de acuerdo con las formas cerradas. Probablemente este no sea el algoritmo más eficiente, pero resolverá el problema. Lo probaré en la unidad mientras escribo esto en mi teléfono.

Me gustaría ir con este enfoque,

Primero, encontremos la suma de los divisores de 1 a N y la mantengamos en una matriz. divs [i] contendrá la suma de divisores:

int divs [50000];
para (int i = 1; i <= n; i ++)
para (int j = 2; j * i divs [j * i] + = i;

Luego, encontremos los pares cuyos divisores se suman entre sí. Esto lleva a ser una verificación lineal:

para (int i = 1; i <= n; i ++)
if (divs [divs [i]] == i && i cout << i << "" << divs [i] << "\ n";

Su complejidad es menor que [matemáticas] n ^ 2 [/ matemáticas], pero no sé si puede ir más rápido. Había leído en alguna parte que hay una manera de generarlos con algunas fórmulas matemáticas, pero que yo sepa, puede que no sea el más rápido.

——————————————————————————

Alegremente

Muhamed Keta, un estudiante aleatorio y bloguero. Para algunas cosas más interesantes, vaya a Cout Code

More Interesting

Cómo usar plantillas y vectores en C ++

¿Existe una función que defina la relación entre el dígito inicial de un entero y el número de términos cuando se agrega infinitamente?

¿Por qué es importante para un programador tener un buen dominio de los conceptos matemáticos?

¿Existe un algoritmo para fusionar dos árboles rojo-negros con una complejidad menor que O (n + m)?

¿Cuál es el método para generar un tamiz para la función Euler Totient?

¿Qué es la criptografía de clave pública en términos simples? ¿Cómo se relaciona con los números primos?

¿Es cierto que al menos uno de los dos términos en [math] Rad (p) - 1, Rad (p) + 1 [/ math] es un número primo, donde [math] Rad (p) [/ math] es el producto de todos los números primos menores o iguales que [math] p [/ math]?

¿Cuál es un ejemplo de un problema cuya respuesta no es obvia, pero si los datos se visualizan de una manera nueva, se vuelven más fáciles de resolver?

¿Cuál es el mejor enfoque para estudiar matemáticas discretas para alguien que considera que es un tema realmente difícil?

¿Cuánta programación necesito saber si quería ingresar a la criptografía?

¿Hay algún fractal completo de Turing?

Cómo usar algoritmos y estructura de datos en la vida real

¿Cómo se mejora su escritura técnica / científica?

¿Cuál es el tipo de datos de optimización de memoria más apropiado en Matlab para importar un archivo de audio que tiene un valor máximo de 0.495971679687500 y el valor mínimo es -0.488983154296875?

¿Por qué una máquina Turing puede ejecutar todos los algoritmos informáticos?