Qual o erro do código? (Java iniciante; Matemática; Fatorial; Arranjo...)

4 respostas
K

Olá, pessoal! Sou eu de novo. Depois das dicas do pessoal daqui, dei uma aperfeiçoada em meu programinha que resolve equações de 2° grau. Agora tentei fazer outro programa utilitário na área da Matemática, um programa que calcula Arranjos (Análise Combinatória). Até consegui resolver os exercícios mais simples do livro, como “A 10,2”. Mesmo assim, quando tento estabelecer “n” como um valor mais alto, o resultado final sai errado. Por exemplo. Quando coloco n=6 k=3, o resultado sai 120, correto. Agora, se coloco n=15 k=3, o resultado sai 4, sendo que o resultado certo seria 4080. Se possível, gostaria de ajuda para descobrir o que está errado com o código, embora tenha quase certeza que é com meu fatorial… Desde já, obrigado!

// Arranjo A(n,k)- Desenvolvido por "Kaff" - 2014

import java.util.Scanner;
public class Arranjo {

	public static void main(String[] args)  {
		Scanner entrada = new Scanner(System.in);
		int fat = 1;
		System.out.println("  *  Calculando o arranjo A (n,k)  *");
		System.out.printf("\n");
		System.out.printf("\n");
		System.out.printf("> Digite o valor de  n: ");
		int n = entrada.nextInt();
		System.out.printf("> Digite o valor de  k: ");
		int k = entrada.nextInt();

		int valor = n;

		for( int i = 2; i <= valor; i++)
		{fat *=i;}

		int fatb = 1;
		int valorb = n-k;

		for( int i = 2; i <= valorb; i++)
		{fatb *=i;}

		int result = (fat/fatb);
		System.out.println(" \n");
		System.out.println(" \n");
		System.out.println(" A "+n+","+k+"  =   "+result+"\n");
	}

}

4 Respostas

CWeiler

Olá Kaff

Não tenho tempo para fazer um teste mais preciso, mas o arranjo de 15,3 seria um número bem grande. Acho que suas variáves int estão estourando, tente usar long.

L

Kaff, boa tarde!

Tomei a liberdade de fazer alguns testes com seu fonte e falha acontece em função dos atributos ( fat, fatb e result ) para que você alcance o valor desejado eles não devem ser do tipo int.

Quando você informa os valores n = 15 e k = 3. No final do seu primeiro for o valor atribuído para fat = 1307674368000. Sabemos que Int suporta valores de -2,147,483,648 ate -2,147,483,648. Penso que melhor caminho seja você usar o tipo long para fat.

Podemos tratar o mesmo conceito para variável fatb. Que no final do loop terá um valor de 479001600.

Apenas não estou certo sobre o resultado que você mencionou de 4080. Eu fiz as alterações no programa para n=15 k=3 teremos um result = 2730.

Por favor faça as alterações no seu fonte e deixe me saber se estou certo com relação ao resultado informado. Abraço e boa sorte!

lucasvvasconcelos

Opa blzinha man.
Vi que você gosta de mexer com números em seus programas.
Estuda um pouco de BigDecimal se são números muitos grandes sem dúvida vai precisar disso.
Aqui explica um pouco…
http://blog.caelum.com.br/arredondamento-no-java-do-double-ao-bigdecimal/
Abraço :slight_smile:

K

Muito obrigado a todos! O que faltava era trocar a variável int por uma long. Até então não conhecia esta variável. Leandro, você está certo, também não sei de onde tirei 4080. Novamente, muito obrigado a todos! :smiley:

Criado 17 de julho de 2014
Ultima resposta 21 de jul. de 2014
Respostas 4
Participantes 4