BigInteger

Olá pessoal,

Como que instancia um objeto da classe BigInteger com o número 1?

[code]public Static BigInteger calculaFatorial (int n) {
BigInteger total = new BigInteger();
/Aki eu não sei como instanciar com o número 1 já.
Se eu fizer isso e fizer total.add(1) ele fica com 1?
/

while (n >= 1) {
total.multiply(n);
n–;
}

return total;
}[/code]

Esse é um método que calcula fatorial de QUALQUER número arbitrário…eu fiz um com double, mas ele calcula até, no máximo, 170.

http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigInteger.html

Isso eu já havia visto, mas continuo sem entender.

Esse método retornaria um número? Como se fosse int…?

Brother, dê uma olhada nos construtores e escolha o que mais lhe convier. Esse aqui, por exemplo. No seu caso, você vai querer tambem dá uma olhada nessa constante.

Mas como trabalhar com constantes?

Há 2 erros aqui
a) O construtor de BigInteger requer uma string ou um double. No seu caso, passe uma string ("1") ou use a constante BigInteger.ONE.
b) BigIntegers, como Strings, são objetos imutáveis, então você tem sempre de atribuir à variável o valor resultante de uma operação.

 public Static BigInteger calculaFatorial (int n) {  
   BigInteger total = BigInteger.ONE;  
   
   while (n >= 1) {  
     total = total.multiply(new BigInteger (n));   // <-- 
     n--;  
   }  
   
   return total;  
 } 

Ele da erro:

1 error found: File: C:\Users\ClaudinhU\Desktop\Fatorial\classes\Fatorial.java [line: 10] Error: C:\Users\ClaudinhU\Desktop\Fatorial\classes\Fatorial.java:10: BigInteger(long) has private access in java.math.BigInteger

O construtor BigInteger(long) tem acesso privado…

[code]import java.math.*;
import java.util.Scanner;

public class Fatorial {

public static BigInteger calculaFatorial (BigInteger n) {
BigInteger total = BigInteger.ONE;

while (n.compareTo(BigInteger.ONE) >= 0) {    
  total = total.multiply(n);
  n.subtract(BigInteger.ONE);    
}    
  
return total;    

}

public static void main (String[] args) {

Scanner input = new Scanner(System.in);

while (true) {
  System.out.println("Digite o valor que voce gostaria de calcular o");
  System.out.println("fatorial:");
  
  String valor = input.nextLine();

  BigInteger valor1 = new BigInteger(valor);

  System.out.println (valor + "! = " + calculaFatorial(valor1).toString());
  
  System.out.println("\n\nGostaria de calcular outro fatorial?");
  System.out.println("1 - Sim, 0 - Não");
  
  int opcao = input.nextInt();
  
  while (opcao != 1) {
    if (opcao == 0) {
      System.exit(0);
    }
    System.out.println ("Opcao Invalida! Tente novamente!");
    opcao = input.nextInt();
  }      
}

}
}[/code]

Isso que está ai não da erro de compilação, mas não funciona…

O que acontece é o seguinte:

Se eu faço:

BigInteger tres = new BigInteger("3"); tres.add(BigInteger.ONE); tres.toString() "3" //Se eu fiz um add, ele deveria somar e retornar 4, e não 3!

Não to entendendo o que acontece com essa classe!

[quote=thingol]Há 2 erros aqui
a) O construtor de BigInteger requer uma string ou um double. No seu caso, passe uma string ("1") ou use a constante BigInteger.ONE.
b) BigIntegers, como Strings, são objetos imutáveis, então você tem sempre de atribuir à variável o valor resultante de uma operação.

[code]
public Static BigInteger calculaFatorial (int n) {
BigInteger total = BigInteger.ONE;

while (n >= 1) {
total = total.multiply(new BigInteger (n)); // <–
n–;
}

return total;
}
[/code][/quote]

Aham, falha nossa - o construtor de BigInteger exige uma string ou então um double. Eu passei um int. Converta esse int para uma string, e tente novamente.

Mas como fazer operações com BigInteger?

Se fizer:

BigInteger total = BigInteger.ONE; total.add(BigInteger.ONE); //O resultado deveria ser 2 total.toString(); "1" //?!?!?!?!

Conseguiiii…

Mas, uma pergunta bem besta, como converter int em String mesmo?

Ai ai ai, agora deixo isso para os universitários.

Pow…

Converter String pra int eu sei…

i = Integer.parseInt(s);

Muitas das perguntas do guj podem ser covertidas para “Como usar a documentação?”.

Dica, para “pegar” um int a partir de uma String você usou um método estático da classe Integer, agora, pra converter um int em String???

Antes que alguém diga, eu sei, eu sei, tem mais umas 1001 de maneiras de fazer isso.

É por isso que o pessoal do C# criou aquela classe System.Convert.

Em Java você precisa saber que para converter uma string para um inteiro você precisa usar Integer.parseInt e um inteiro em uma String, usar String.valueOf, ou talvez String.format, ou concatenar com uma string vazia (""), ou Integer.toString(), ou sei lá o quê. É sempre com um nome diferente e em lugares diferentes.

Em C# basta usar Convert.ToInt32() para converter várias coisas para um int, e Convert.ToString() para converter várias coisas para uma String. Não tem essa confusão toda de ter de olhar páginas e páginas de documentação :frowning:

É verdadeeeee…

valueOf…

Mas já havia conseguido…nem precisei…pois eu recebo o dado por Scanner…é só receber uma String e criar um BigInteger com essa String…

PORÉM…tenho um outro problema agora…

[quote]
Digite o valor que voce gostaria de calcular o
fatorial:
34
34! = 295232799039604140847618609643520000000

Gostaria de calcular outro fatorial?
1 - Sim, 0 - Não
1
Digite o valor que voce gostaria de calcular o
java.lang.NumberFormatException: Zero length BigInteger
at java.math.BigInteger.<init>(Unknown Source)
at java.math.BigInteger.<init>(Unknown Source)
at Fatorial.inicio(Fatorial.java:34)

fatorial:[/quote]

Esse erro acontece e não sei pq…

O laço que está isso está aqui…

[code]while (true) {
System.out.println(“Digite o valor que voce gostaria de calcular o”);
System.out.println(“fatorial:”);

  String valor = input.nextLine();
  
  BigInteger valorBI = new BigInteger(valor); //Essa é a linha 34...
      
  System.out.println (valor + "! = " + calculaFatorial(valorBI).toString());
  
  System.out.println("\n\nGostaria de calcular outro fatorial?");
  System.out.println("1 - Sim, 0 - Não");
  
  int opcao = input.nextInt();
  
  boolean escolha = true;
  
  while (escolha == true) {
    if (opcao == 0) {
      System.exit(0);
    }
    else if (opcao == 1) {
      escolha = false; //Aqui é pra sair do laço
      valor = null; //Aqui é pra String valor ser "resetada"
      valorBI = BigInteger.ZERO; //Aqui é pra zerar o valor do valorBI
    }
    else {
      System.out.println("Opcao invalida! Tenta novamente!");
      opcao = input.nextInt();
    }
  }
}[/code]

aproveitando o ensejo por que não dá certo:

	[code]String a = "10";
	int c = 0;
	int i = Integer.parseInt(a);  
   int b = a + c; [/code]

a => String
c => int
a + c => Usado o operador “+” de concatenação, não o operador “+” de soma. O resultado é uma String
String => não pode ser jogada diretamente em um int (b).

Se pudesse, ia dar “100” (como em Javascript), não 10 (como você está esperando).