El código original si se ejecuta de manera infinita. El detalle está en el segundo for que es infinito pues j nunca es menor a 1 (como ya notaste y corregiste).
Revisando la que se supondría última iteración cuando j vale 1, el siguiente valor de j se calcula:
j -= j / 2
j vale 1, por lo que la división sería 1/2, como se está manejando enteros la división resulta en 0, con lo que la operación quedaría:
j -= 0
por lo que j no sufre ningún cambio al no restarle nada.
Por lo tanto, en lugar de terminar el ciclo for se continúa de manera indefinida pues j se mantiene en 1.
La corrección es la que ya realizaste, cambiar la condición.