Como que instancia um objeto da classe BigInteger com o número 1?
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;
}
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.
Isso eu já havia visto, mas continuo sem entender.
Esse método retornaria um número? Como se fosse int…?
O
ozix
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.
claudneto
Mas como trabalhar com constantes?
T
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.
O construtor BigInteger(long) tem acesso privado...
importjava.math.*;importjava.util.Scanner;publicclassFatorial{publicstaticBigIntegercalculaFatorial(BigIntegern){BigIntegertotal=BigInteger.ONE;while(n.compareTo(BigInteger.ONE)>=0){total=total.multiply(n);n.subtract(BigInteger.ONE);}returntotal;}publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);while(true){System.out.println("Digite o valor que voce gostaria de calcular o");System.out.println("fatorial:");Stringvalor=input.nextLine();BigIntegervalor1=newBigInteger(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");intopcao=input.nextInt();while(opcao!=1){if(opcao==0){System.exit(0);}System.out.println("Opcao Invalida! Tente novamente!");opcao=input.nextInt();}}}}
Isso que está ai não da erro de compilação, mas não funciona...
O que acontece é o seguinte:
Se eu faço:
BigIntegertres=newBigInteger("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!
T
thingol
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.
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.
claudneto
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" //?!?!?!?!
claudneto
Conseguiiii…
Mas, uma pergunta bem besta, como converter int em String mesmo?
T
thingol
Ai ai ai, agora deixo isso para os universitários.
claudneto
Pow…
Converter String pra int eu sei…
i=Integer.parseInt(s);
O
ozix
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.
T
thingol
É 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
claudneto
É 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...
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:
Esse erro acontece e não sei pq...
O laço que está isso está aqui...
while(true){System.out.println("Digite o valor que voce gostaria de calcular o");System.out.println("fatorial:");Stringvalor=input.nextLine();BigIntegervalorBI=newBigInteger(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");intopcao=input.nextInt();booleanescolha=true;while(escolha==true){if(opcao==0){System.exit(0);}elseif(opcao==1){escolha=false;//Aqui é pra sair do laçovalor=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();}}}
A
andredecotia
aproveitando o ensejo por que não dá certo:
String a = "10";
int c = 0;
int i = Integer.parseInt(a);
int b = a + c;
E
entanglement
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).