[RESOLVIDO]Apostila Caelum FJ11 Exercicio 3.1.3 4)

19 respostas
esdrasevt

Galera, o exercicio é este:

4) Imprima os fatoriais de 1 a 10.
O fatorial de um número n é n * n-1 * n-2 … até n = 1. Lembre-se de utilizar os parênteses. O fatorial de 0 é
1 O fatorial de 1 é (0!) * 1 = 1 O fatorial de 2 é (1!) * 2 = 2 O fatorial de 3 é (2!) * 3 = 6 O fatorial de 4 é (3!) *
4 = 24
Faça um for que inicie uma variável n (número) como 1 e fatorial (resultado) como 1 e varia n de 1 até 10:
for (int n=1, fatorial=1; n <= 10; n++) {

Consegui fazer um codigo que faça o proposto, mas estou tentando criar algo mais pratico, sem ter que fazer um if para cada fatorial, fazendo com que a variavel “fatorial” varie com o “n” me ajudem nessa? Ja quebrei muito a cabeça. Segue o código que fiz:

class Exercicio_313_4 { static public void main(String [] args) { for (int n = 1, fatorial = 1; n <=10; n++) { if (n == 1) { System.out.println("1! = 1 "); } else { if (n == 2) { System.out.println("2! = 2 * 1 = 2"); } else { if (n == 3) { System.out.println("3! = 3 * 2 * 1 = 3"); } else { if (n == 4) { System.out.println("4! = 4 * 3 * 2 * 1 = 24"); } else { if (n == 5) { System.out.println("5! = 5 * 4 * 3 * 2 * 1 = 120"); } else { if (n == 6) { System.out.println("6! = 6 * 5 * 4 * 3 * 2 * 1 = 720"); } else { if (n == 7) { System.out.println("7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 = 5040"); } else { if (n == 8) { System.out.println("8! = 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 40320"); } else { if (n == 9) { System.out.println("9! = 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 362880"); } else { if (n == 10) { System.out.println("10! = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800"); } } } } } } } } } } } } }

19 Respostas

rvcabral

cara isso é uma POG das grandes!!! POG => http://www.programei.org/index.php/08/09/2009/pog-programacao-orientada-a-gambiarra/

vamos fazer o algoritmo em portugues:

leia o numero

enquanto o numero for maior que 1 vá repetindo

numero = numero * numero - 1

FAZ UNS AJUSTES, DÁ UMA ENFEITADA E SAI BONITINHO

Victor_Neves

cara isso é programaçao totalmente estruturada…é algo totalmente NAO-orientado a objeto…
vou dar uma dica boa… enquanto voce estuda essa apostila, tenta dar umas lidas em UML… pra reforçar bem a ideia de OO

gcavassani

testando…

Hildebrando_Pedroni

Cara.
Isso que vc está fazendo realmente não é boa coisa.

A idéia é criar uma rotina que facilite a vida e faça os calculos de numeros fatoriais.
O seu codigo não tem nenhum calculo. É claro que ele vai imprimir tudo correto, afinal vc colocou todos os numero e iterações no seu codigo.
Agora imagine que o exercicio mude e ao inves de imprimir 10 numeros fatorias vc tenha que imprimir 20.
Vai você no codigo e coloca mais 10 vezes o system.out… pra que os 20 numeros sejam exibidos.
Ai depois o professor desiste e fala pra voltar pra 10. putz!!! volta no codigo e tira tudo.
Já pensou?

Tenta desta forma, utilizando os conceitos que a apostila esta te dando.

O numero fatorial é definido por n * n-1
Então temos que calcular o valor de n para qualquer valor
n = 10! = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
E não pode esquecer que !0 = 1

//Existem outras formas de fazer, vai da lógica de cada um

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

		for (int i = 1; i <= 10; i++) {
			int numeroFatorado = new Fatorial().calculaFatorial(i);
			System.out.println("Fatorial de " + i + "=" + numeroFatorado);

		}

	}

	public int calculaFatorial(int num) { //recebo o numero que quero fatorar
		if (num == 0) {
			return num + 1; //se for 0 então a saida deve ser 1
		}
		int contador = num; // um contador que vai servir para sair do while e para calcular o valor do fatorial
		while (contador > 1) {
			num = num * (contador - 1); // Aqui que a mágica acontece
			contador--; // decremento o contador, para sair e para calcular o numero correto da proxima vez;
		}
		return num;
	}

}

funciona assim:

vamos supor que num está valendo 5

dentro do calculaFatorial(num)

primeira iteração
num vale 5
contador vale 5
num = num * (contador - 1)
5 = 5 * (5-1); // num passa a ser 20
5–

na segunda iteração

num vale 20
contador vale 4
num = num * (contador - 1)
20 = 20 * (4 - 1); // num passa a ser 60
4–

na terceira iteração

num vale 60
contador vale 3
num = num * (contador - 1)
60 = 60 * (3 - 1); // num passa a ser 120
3–

na quarta iteração

num vale 120
contador vale 2
num = num * (contador - 1)
120 = 120 * (2 - 1); // num continua a ser 120 porque qualquer numero multiplicado por 1 é ele mesmo.
2–

na próxima iteração o contador vale 1 então ele sai do laço por não satisfazer a condição;

espero ter te ajudado a entender a lógica.

pedroroxd

PELO AMOR DE DEUS
QUE GAMBIARRA DA PORRA
kkkkkkkkkkkkkkkkk
Ri pouco!

pedroroxd
Exemplo:
import java.util.Scanner;

public class Fatorial {

	public static void main(String[] args) {

		long result = 1;
		long valordigitado = 0;
		String valorde = "";
		
		System.out.println("Digite um numero: ");
		Scanner scn = new Scanner(System.in);
		valordigitado = scn.nextLong();
		
		while (valordigitado >=1) {
			result = valordigitado * result;
			System.out.println(valordigitado + "x" + result/valordigitado + " = " + result);
			valordigitado--;
			valorde = String.valueOf(result);
		}
		System.out.println();
		System.out.println("Portanto, o resultado é " + valorde);
	}
}
pedroroxd
Exemplo de mostrar fatorial de um número até outro:
import java.util.Scanner;
import javax.swing.JOptionPane;

public class Fatorial {

	public static void main(String[] args) {

		Scanner scn = new Scanner(System.in);
		System.out.println("Digite em que numero deseja começar");
		int iinicio = scn.nextInt();
		System.out.println("Digite em que numero deseja terminar");
		int ifinal = scn.nextInt();
		

		if (iinicio > ifinal) {
			JOptionPane.showMessageDialog(null,
					"O final tem que ser maior que o inicial.");
		}

		for (int i = iinicio; i <= ifinal; i++) {
			System.out.println(i + "! = " + fatorial(i));
		}

	}

	public static long fatorial(long num) {
		if (num <= 1)
			return 1;
		else
			return num * fatorial(num - 1);
	}

}
Exemplo: Digite em que numero deseja começar [color=green]1[/color] Digite em que numero deseja terminar [color=green]5[/color] 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120
Hildebrando_Pedroni

Como eu disse, existem formas e formas de se fazer.
Cada um tem a sua lógica.
Eu tentei explicar de forma simples, utilizando o que o amigo deve ter visto na apostila até agora…

Enfim, dois modos de se fazer a mesma coisa.

evertonsilvagomesjav

À ideia do Hilde esta bem tranquila de entender, acho que vc deveria seguir por ai…

R

tente usar recursividade que fica bem melhor abraços

Hildebrando_Pedroni

Sim, com recursividade fica realmente melhor.
Só não concordo em colocar um método recursivo para ensinar a lógica do que está acontecendo para o cara que fez a pergunta.
Pelo ponto que ele está da apostila, eu acredito que ele não tenha visto recursividade ainda, a não ser que tenha visto em outro lugar. Mas visto o código que ele postou, acredito que o modo não recursivo seja mais fácil dele entender neste momento.

Enfim, acredito termos ai para o rapaz uma forma simples e uma forma recursiva que ele pode pegar, aplicar, modificar e continuar aprendendo.

Não desista.

abraços

S

pedroroxd:
PELO AMOR DE DEUS
QUE GAMBIARRA DA PORRA
kkkkkkkkkkkkkkkkk
Ri pouco!

E aí Pedro, tranquilo?
Cara, por mais que voce tenha demonstrado exemplos depois dessa mensagem, voce pode desanimar o cara dessa maneira, ele tá no básico do básico velho, todos já passamos por isso. :wink:

Eu sugiro ao esdrasevt estudar mais lógica de programação e só depois java.

pedroroxd

Sorry, a intenção não foi desanima-lo, mas mostrar que o algorítimo é incrédulo…
É a mesma coisa de o professor pedir para você fazer um algorítimo que axe o valor de um número digitado - 1, e vc fazer isso:

Scanner scn = new Scanner(System.in) System.out.println("Digite um numero"); int num = scn.nextint(); int result; if (num==5) { result = 4; } else if (num==4){ result = 3; } . . . . .
É uma gambiarra, uma POG (programação orientada a gambiarra)

esdrasevt

Hildebrando Pedroni concordo com vc, o codigo que postei não é nem um pouco funcional. Estou começando com programação agora, e ja escolhi java de cara, então até agora so conheço alguns comandos: system.out, while, if e else, for. Então tentei resolver o exercicio com o que conhecia, qubrei a cabeça pra tentar fazer automático como vc disse mas não consegui kkkk. Por isso postei a dúvida aqui. Tô dando uma olhada nas resluções que vcs postaram, muita coisa não entendo ainda então to pegando cada comando que vcs postaram e lendo sobre pra conseguir entender o codigo. To sem muito tempo pra isso, mas assim que eu entender os códigos posto aqui denovo. Valeu pela ajuda galera!

perdeu

vixiiiiiiiii

Hildebrando_Pedroni

Cara, dou a maior força.
Poste as duvidas, diga o que vc não entendeu.

Mas a principio te dou uma diga: Estude logica de programação e algoritimos.
Você pode estudar isso em paralelo a java.

Ai qualquer coisa é só postar.

Abraços

mano8801
public int CalculaFatorial(int numero){

		if(numero==1)
		  return 1;
		else
		  return numero*this.CalculaFatorial(numero-1);


}

acho que seria assim o jeito mais simples possível...

Hildebrando_Pedroni

Galera.
Recursividade é muito Legal, e pode economizar linhas de código, mas lembrem sempre disso:

Nem sempre é correto utilizar o metodo recursivo.
E como eu disse antes, o rapaz ainda não viu isso. Não tente ensinar a tabuada a quem ainda não aprendeu a somar.

Abraços

Sra.Style

Olá pessoal Boa Noite,

Estou começando a estudar agora pela apostila Caelum e sou nova no forum tb…

Fiz dessa forma, pelo que eu vi o meu ta um pouco diferente

public class Fatorial {

	public static void main(String[] args) {
		int fatorial = 1;
						
		for (int i=1; i <= 10; i++){
		    fatorial *= i;	
   System.out.println("O fatorial de " + i + " é igual a " + fatorial );
		}
	
	}
}

Bjus a todos e boa sorte :slight_smile:

Criado 26 de março de 2010
Ultima resposta 3 de abr. de 2010
Respostas 19
Participantes 12