Sem usar array é complicado, pois é o que eu usaria (guardaria os dígitos em um array e faria uma versão “genérica” do algoritmo abaixo).
Mas para esse caso específico (um número de exatamente 4 dígitos), e sem usar String ou array, daria pra fazer assim:
int n = 9241;
int d4 = n % 10;
int d3 = (n / 10) % 10;
int d2 = (n / 100) % 10;
int d1 = n / 1000;
for (int i = 9; i >= 1; i--) {
if (d1 == i) {
System.out.print("o ");
d1--;
} else System.out.print(" ");
if (d2 == i) {
System.out.print("o ");
d2--;
} else System.out.print(" ");
if (d3 == i) {
System.out.print("o ");
d3--;
} else System.out.print(" ");
if (d4 == i) {
System.out.print("o ");
d4--;
} else System.out.print(" ");
System.out.println();
}
Primeiro eu uso divisões e resto da divisão (%) para pegar cada um dos dígitos.
Depois faço um loop de 9 a 1, e verifico se cada dígito é igual ao valor da linha atual (a primeira linha é 9, a segunda é 8, etc). Se for, eu imprimo um caractere da coluna (decrementando o dígito correspondente, assim ele também será impresso na linha seguinte) e se não for eu só imprimo espaço.
O resultado é:
o
o
o
o
o
o o
o o
o o o
o o o o
Outra opção é ver se o dígito é maior ou igual ao valor da linha atual:
for (int i = 9; i >= 1; i--) {
if (d1 >= i)
System.out.print("o ");
else System.out.print(" ");
if (d2 >= i)
System.out.print("o ");
else System.out.print(" ");
if (d3 >= i)
System.out.print("o ");
else System.out.print(" ");
if (d4 >= i)
System.out.print("o ");
else System.out.print(" ");
System.out.println();
}
Assim não precisa nem mudar o valor das variáveis.