Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida no Ex. 6 da Aula 2 - Variáveis e fluxo

Consegui fazer o código para apresentar somente o resultado, depois fiquei pensando como poderia exibir a conta, em nosso execício, como eu poderia escrever 1x2x3x4x5x6 = resultado.

Fiz um primeiro modelo que ficou assim:

class A02E06{
    public static void main(String[] args){
        int n = 1;
        int fatorial = 1;
        System.out.print("Fatorial de 10! = ");
        for(n=1; n<=10; n++){
            fatorial = fatorial * n;
            System.out.print(n + " x ");
        }
        System.out.print(" = " + fatorial + "\n");
    }
}

Mas apresentava um x a mais erradamente e ficava assim: Fatorial de 10! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x = 3628800

Fiquei pensando e cheguei no seguinte código:

class A02E06{
    public static void main(String[] args){
        int n = 1;
        int fatorial = 1;
        System.out.print("Fatorial de 10! = ");
        for(n=1; n<=10; n++){
            fatorial = fatorial * n;
            System.out.print(n);
            if(n<10){
                System.out.print(" x ");
            }
        }
        System.out.print(" = " + fatorial + "\n");
    }
}

Cheguei no resultado esperado: Fatorial de 10! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 = 3628800

Minha dúvida é, como poderia fazer este código de uma maneira mais simples? Acho que ficou bastante feio, rs.

5 respostas

Creio que podemos melhorar o seu código:

class A02E06{
    public static void main(String[] args){

        int fatorial = 1;

       System.out.print("Fatorial de 10! = 1 x ");

        for(int n=2; n<10; n++){

            fatorial = fatorial * n;
            System.out.print(n + " x ");

        }

        System.out.print("10 = " + (fatorial*10) + "\n");

    }
}

Espero ter ajudado um pouquinho rsrsrs

Henrique para realizar cálculos de fatoriais você pode estar utilizando recursividade(uma função que chame ela mesma), fica muito menor e mais fácil sua manutenção.

Para calcular um fatorial de 5 por exemplo:

public static void main(String[] args) {
    System.out.println(calcula(5));
}

public static int calcula(int numero) {
    if (numero == 0)
        return 1;
    return numero * calcula(numero - 1);
}

O código realmente fica menor e serve para qualquer numero fatorial, ficando também genérico, porém o preço que se pega para implementar funções recursivas são suas complexidades, nesse exemplo é uma função simples, mas as vezes fica complexo em relação a um simples for ou while.

Espero ter ajudado.

solução!

Olá Henrique! A forma como o Edgar fez é uma boa opção. Porém, esta forma há alguns problemas de manutenção, veja que se você quiser fazer o fatorial de outro número, será necessário alterar em 4 lugares o método. Então se torna de certo ponto uma forma não muito boa em boas práticas de programação.

Fiz de outra forma e pensando em utilizar menos código e utilizando métodos das Classes de Java:

public class Fatorial {

    public static void main(String[] args) {
        int fatorial = 1;
        String operacao = "";        
        for (int n = 1; n <= 10; n++) {
            fatorial = fatorial * n;
            operacao = operacao + " x " + n;
        }
        operacao = operacao.substring(3);
        System.out.println("Fatorial de 10 = " + operacao + " = " + fatorial);

    }
}

Da mesma forma como você fez, dentro do for() criei a operação em String. Porém, ao invés de simplesmente imprimir cada número com o System.out.print eu armazenei a String em uma variavel chamada operacao, que foi criada antes do inicio do for() e vazia inicialmente. Assim, a cada laço a operação ia sendo formada da seguinte forma:

x 1
x 1 x 2
x 1 x 2 x 3
x 1 x 2 x 3 x 4,

...

x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10

Você pode estar se perguntando. "Qual a diferença?" e "Porque armazenar a String em uma variável e não imprimir logo?".

Então... Ao final veja que temos o mesmo problema que você, a diferença é que o "x" agora está no inicio. Isso foi proposital!

Ao armazenarmos essa String em uma variável, podemos fazer uso de todos os métodos da classe String e um desses métodos é o substring(). Esse método nos retorna uma String a partir da String por ele invocada, no entanto essa nova string começará a partir do index do caracter informado como parâmetro, começando em 0. Exemplo:

String fruta = "banana";

fruta.substring(1); // Retorna "anana"
fruta.substring(2); // Retorna "nana"

Assim, utilizei este método para retrirar os 2 espaços e o "x", logo pus para minha nova string começar do caracter de index 3, ou seja, o 1. Assim, armazenei a nova String na própria variável operação.

Assim so fiz imprimir no console o que desejava.

Pra que você possa ver a vantagem da forma que fiz, podemos modifica-la um pouco mais e coloca-la em um método, ficando assim:

public class Fatorial {

    public static void main(String[] args) {
        fatora(10);
        fatora(12);
        fatora(15);

    }

    private static void fatora(int numero) {
        int fatorial = 1;
        String operacao = "";        
        for (int n = 1; n <= numero; n++) {
            fatorial = fatorial * n;
            operacao = operacao + " x " + n;
        }
        operacao = operacao.substring(3);
        System.out.println("Fatorial de "+ numero + " = " + operacao + " = " + fatorial);
    }
}

Agora basta chamamos o método fatorial() passando o numero como argumento, que é devolvido o valor no console com a expressão pronta.

A saída no console foi a seguinte para os 3 métodos chamados:

Fatorial de 10 = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 = 3628800
Fatorial de 12 = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479001600
Fatorial de 15 = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 x 13 x 14 x 15 = 2004310016

Espero ter ajudado! Bons Estudos!

Obrigado a todos!

Todas as respostas agregaram bastante!

Muito bom ver outras maneiras de se resolver um mesmo problema.

De nada Henrique, sempre que precisar não deixe de criar suas dúvidas.