Como converter código trocando for por while?

Dado esse código:

public class ImprimeMensagem1
{
    public static void main(String[] args)
    {
        int s = 0;
        int t = 1;
        
        for(int i = 0; i < 10; i++)
        {
            s = s + i;
            for(int j = i; j > 0; j--)
            {
                t = t * (j - i);
            }
            s = s * t;
            System.out.println("T vale: " + t);
        }
    
        System.out.println("S vale: " + s);
    }
}

com essa saída:

T vale: 1
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
S vale: 0

converti o código trocando o for pelo while:

public class ImprimeMensagem
{
    public static void main(String[] args)
    {
        int s = 0;
        int t = 1;
        int i;
        int j; 
        
        i = 0; 
        while (i < 10) 
        {
            s = s + i;
            i++;
                    
            j = i; 
            while (j > 0) 
            {
                t = t * (j - i);
                j--;
            }
            s = s * t;
            System.out.println("T vale: " + t);
        }
    
        System.out.println("S vale: " + s);
    }
}

que tem essa saída:

T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
T vale: 0
S vale: 0

como podem ver meu código não está saindo como o código original, especialmente na primeira linha, e não consegui identificar o meu erro, oq tenho q fazer?

Para transformar um for em while, primeiramente você precisa entender o que ocorre por baixo dos panos.
Por exemplo, no código seguinte:

for(int i = 0; i < 10; i++)
        {
            int conta = i * 2;
        }

os seguintes passo serão tomados para a interpretação desse loop:

  1. O compilador inicializará a variável i (int i = 0), no qual será executado apenas uma única vez;
  2. Em seguida ele fará o teste de terminação do loop (i < 10), se for verdadeiro, entra no loop, se for falso, sai dele;
  3. Ele executará todo o código do interior do loop (int conta = i * 2;);
  4. Após isso, o compilador incrementará a variável de inicialização (i++);
  5. Repete todo o processo a partir do ponto 2, até o teste resultar em falso;

Para mais informações, recomendo a leitura da documentação no site da Oracle.

Então, pelo o que pude perceber no seu código, houve um pequeno equívoco na interpretação desses passos, pois o incremento é a última coisa a ocorrer no loop. Portanto, seu while deveria ser assim:

// Inicialização da variável i (laço externo)
int i = 0;

// Teste de terminação (laço externo)
while (i < 10) 
{

// Código (laço externo)
    s = s + i;

    // Inicialização da variável j (laço interno)
    int j = i; 

    // Teste de terminação (laço interno)
    while (j > 0) 
    {

    // Código (laço interno)
        t = t * (j - i);

    // decremento da variável j (laço interno)
        j--;
    }
    s = s * t;
    System.out.println("T vale: " + t);
}

System.out.println("S vale: " + s);

// Incremento da variável i (laço externo)
i++;
}

Teste aí e vê se dá certo.
A única mudança que fiz foi alterar o incremento da variável i de lugar (coloquei ele na última linha).

do jeito q voce colocou saía “T vale: 1” infinitas vezes, pra dar certo eu coloquei o i++ dentro do laço externo, mas valeu, você me ajudou bastante, obrigado