Para que veas como resolver este código te muestro un ejemplo con el comentario 3.
Imagina que tienes el número 18. 18 = 2 * 3 ^ 2 descompuesto en factores primos. Entonces supongamos que <aux1 = 18> (recuerda que <aux1> es tipo <float>):
for(i = 2; i <= aux1; i = i + 1){
div1 = aux1 / i;
div2 = aux1 / i;
Empezamos con el 2 y dividimos <aux> (18 en nuestro caso) entre 2 y guardamos el resultado sin decimales en <div1> porque es tipo <int> y el resultado con decimales en <div2> porque es tipo <float>. En nuestro caso <div1 = 9> y <div2 = 9.0>.
if (div1 - div2 == 0)
Aquí comparamos que sean iguales, es decir que si el resultado sin decimales es igual al resultado con decimales significa que <aux> es divisible por <i>. En nuestro caso sí que lo es entonces analizamos el bloque del if.
aux1 = aux1 / i;
j = 1;
while (j <= 4)
Con esto asignamos el valor de la división a aux1. En nuestro ejemplo <aux1 = 9> y empezamos a contar desde <j = 1> hasta <j = 4> incluido porque vamos a recorrer el array base1[5] que como su nombre indica almacena los números que dividen a <aux1>.
if (base1[j] == i){
exp1[j] = exp1[j] + 1;
j = 100;
}
Para cada j en rango [1,4] comprobamos si ya hemos introducido antes ese divisor (recordemos <i = 2>). En el caso de que sí, se cumpliría el if y entonces aumentaríamos el exponente en esa posición. No es nuestro caso, pero si lo fuera se asignaría <j = 100> simplemente para que sea > 4 y así terminar el <while>.
if (base1[j] == 0){
base1[j] = i;
exp1[j] = 1;
j = 100;
}
En cambio si hay un 0 en el array base1 entonces metemos el divisor en esa posición y ponemos el exponente a 1. Se pone <j = 100> para salir del <while>.
Como es nuestro caso nuestros arrays quedarían así:
base1[5] = {0,2,0,0,0}
exp1[5] = {0,1,0,0,0}
Es decir que <aux1 = 18> es divisible por 2^1.
j = j + 1;
Se reinicia el contador i a 1 ya que al terminar el <for> se ejecuta el incremento <i = i + 1> y entonces <i = 2>. ¿Por qué otra vez 2? Porque puede ser divisible por 2, más de 1 vez. Y se repite todo, ahora más rápido ya que te he explicado con detalle la primera iteración del <for>.
<i = 2> <aux1 = 9> -> 9 no es divisible por 2, entonces nos saltamos todo el <if> y hacemos otra iteración con <i = 3> (ahora no se ha hecho <i = 1> porque no hemos entrado en el <if>).
<i = 3> <aux1 = 9> -> 9 sí es divisible por 3, entonces <aux1 = 3> y entramos al if. ¿Existe ya el 3 en <base1>? No. Vamos al siguiente <if>, buscamos el primer 0 y metemos el 3 y ponemos a 1 el array <exp1> en esa posición. Resultado:
base1[5] = {0,2,1,0,0}
exp1[5] = {0,1,1,0,0}
Es decir que <aux1 = 18> es divisible por (2^1 * 3^1).
Ahora sí, reiniciamos i <i = 1> y otra iteración pero ahora <aux1 = 3>.
<i = 2> <aux1 = 3> -> 3 no es divisible por 2. No hacemos nada.
<i = 3> <aux1 = 3> -> 3 sí es divisible por 3, entonces <aux1 = 1> y entramos al <if>. ¿Existe ya el 3 en <base1>? Sí, entonces incrementamos el exponente y salimos del while. Resultado:
base1[5] = {0,2,3,0,0}
exp1[5] = {0,1,2,0,0}
Es decir que <aux1 = 18> es divisible por (2^1 * 3^2).
Ahora reiniciamos <i = 1> y <aux1 = 1>. Se ejecuta el incremento del <for> entonces <i = 2> y como no se cumple la condición del <for> ya que 2 > 1 entonces termina aquí este bloque.
Y ya tendríamos el número <aux1> descompuesto en factores primos, necesario para calcular el mcm y el mcd. Te recuerdo que aunque estoy escribiendo la posición 0 de los arrays en tus programas no se hace uso de ella (tus programas empiezan a contar en la posición 1).
Revisa la explicación, vete paso a paso comprendiendo lo que hace y porqué lo hace e intenta entender algún comentario más. La próxima duda que tengas espero que sea más específica ya que no puedo estar explicando un programa línea a línea. Por lo menos comenta hasta donde has entendido (o lo que te parezca que hace el programa) o que cosas entiendes para ahorrarme esas explicaciones.
Y recuerda que siempre puedes ir paso a paso como he hecho yo aquí poniendo cuanto vale cada variable en cada momento.