BigInteger!?!?!?

45 respostas
GALACTUS

Fala galera, tudo jóinha com vocês???

Então galera, eu já procurei no google e só tem coisa complicada lá explicando o BigInteger e eu queria só saber como eu faço pra fazer uma comparação com big integer no laço for?!?!?!?
Eu já fiz o programa todinho e dá erro no laço for porque diz que o BigInteger não aceita <= como comparação.

esse é o for:

for(quadro=1;quadro<=64;quadro++)

Véiu, só falta isso, se alguem poder me explicar com faz éssa comparação com BigInteger, lembrando que a variável quadro é BigInteger.

45 Respostas

jpcasati
BigInteger n1 = new BigInteger("50");
BigInteger n2 = new BigInteger("25");

n1.compareTo(n2); // O retorno vai ser -1 se n1<n2 ; 0 se iguais e 1 se n1 > n2

Já te ajuda a resolver o problema.

Use uma IDE, tipo netbeans, ali voce ve todos os métodos das classes, e uma documentaçãozinha de como utilizá-las.

GALACTUS

Então véiu, eu uso o NetBeans só que não entendi muito lá como usa o BigInteger sabe, e aquele programa que você fez estác erto porém se eu ficar pegando os códigos dos outros então não vai adiantar nada eu aprender Java e eu não vou aprender nada assim, entendeu, a lógica do meu programa está certo, só preciso saber como eu faço essa comparação do BigInteger dentro fo for.

jpcasati

na verdade akela variável dentro do for não precisa ser BigInteger, ela só vai até 64 mesmo…
Mas se você quer por no for, faz o seguinte:

BigInteger inc = new BigInteger("1");
BigInteger n1 = new BigInteger("1");
BigInteger n2 = new BigInteger("64");

for(;n1.compareTo(n2) < 1;n1.add(inc)){
    //Não testei o código, mas acho que é por aí!
}
GALACTUS

Não dá, tentei mudar umas coisinhas mas não deu, mas ae cara, valeu pela força, vou fazer de outro geito que é melhor, valeu.

Danillo_Moreno

Galactus, só me responde uma coisinha…

Essa variável BigInteger que vc quer por no FOR é para aquele problema dos grãos de trigo ainda???

Porque se for as variáveis dentro do FOR podem ser do tipo int… Vai só até 64 mesmo…

Você põe apenas a resposta como BigInteger, pois é um numero muito grande…

claudneto

Vc pode fazer tudo com int e apenas a soma com BigInteger…

GALACTUS

Eu já tentei fazer isso, mas ele fala que o BigInteger não aceita int, tipo a variável n1 é BigInteger e e´la está recebendo está recebendo um valor de uma variável int.

só que aí eu fiz assim pra resolver esse problema:

n1=quadro.multiply(n2);

e funcionou essa linha porém a variável quadro vem de um resultado dentro do for veja só;

for(quadro=1;quadro<=64;quadro++)

e é no for que eu não sei manipular o BigInteger pra ele comparar se é menor ou igual a 64, galera, eu sei que sou burro, mas eu sinto que eu to quase chegando lá, eu não vou copiar o programinha que o jpcasati fez porque se não eu não vou aprender ABSOLUTAMENTE nada, porém atraves do programinha dele, deu pra mim enender cmo funciona mais ou menos o BigInteger.

Só que aconteceu um desastre aqui.
Eu fiquei nervoso e acabei excluindo o programa hahahaha, mas eu lembro de cabeça é também quando eu for fazer ele de novo vai ser melhor pra mim pensar mais.

Danillo_Moreno

GALACTUS, você não é burro, você está aprendendo…

Mas para aprender tem que saber ouvir (nesse caso, ler)…

Siga o conselho não tente usar o BigInteger para manipular as iterações do for, ainda mais por que o máximo desse for é 64…

Você está tentando matar uma mosca com uma bazuca…

Manipule o for com int e use o BigInteger apenas para somar o resultado…

GALACTUS

Então véiu, eu já tentei fazer isso mas a varivavel BigInteger não recebe valores int. Pelo menos foi a mensagem que apareceu aqui.

Veja só, esse é o meu programa:

import javax.swing.JOptionPane;
public class MyClass 
{
    public static void main() 
    {
        int quadro=0, // variável que representará cada quadro do tabuleiro do xadrês
                trigo=1, // variável que representará os trigos que serão colocados em cada quadro do xadrês
          trigototal=0, // variável que somará todos os trigos que foram colocados nos quadros do xadrês
                       n1; // variável que engana o segundo laço FOR

           for(quadro=1;quadro<=64;quadro++)
           {
            n1=trigo+1;
                   for(trigo=trigo;trigo<=n1;trigo*=2)
                   {
                   trigototal+=trigo;
                   n1=0;
                   }
            } 
           JOptionPane.showMessageDialog(null,""+trigototal,"RESULTADO",JOptionPane.PLAIN_MESSAGE);
    }
}

Eu imagino que as variáveis que seriam BigInteger seriam n1 e trigototal né:

claudneto

Se vc criar o quadro (valor máximo 64) como BigInteger…compare-o como se fosse String…

n1.compareTo(n2) < 0 //n1 < n2 n1.compareTo(n2) <= 0 //n1 <= n2 n1.compareTo(n2) > 0 //n1 > n2

Com isso vc consegue fazer a comparação…

Vc precisa fazer o quadro++ com as funções do BigInteger…não conheço a função, mas vc usará como a função multiply()

Espero ter ajudado…

Danillo_Moreno

Mude sua linha de pensamento…

esse seu segundo FOR dentro do primeiro não tem razão de existência…

Deixe a variavel quadro como inte ponha as variaveis trigo e trigo total como BigInteger…

GALACTUS

UUUUUUMM pode crê véiu, eu vou tentar fazer essa bagaça ae.
Valeu véiu.

GALACTUS

É porque eu entendi assim, o primeiro for significa cada quadro do tabuleiro e o segundo for significa a quantidade de trigo que vai sendo jogado em cada quadro, manjou.???

Danillo_Moreno

Mas se a quantidade de trigo que será colocado na próxima casa do tabuleiro é o dobro da atual, você precisa de um FOR para que?

Você só precisa saber o valor atual e multiplicá-lo por dois…

Entendeu???

GALACTUS

Opa, pode crê véiu, conforme o primeiro laço FOR fôr rodando eu já posso ir fazendo o trigo total, demoro, já vou fazer isso, valeu véiu.

Pô véiu, você tem uma lógica de programação incrivel em, valeu mesmo.

adriano_si

esse problema do tabuleiro de Xadrez não propõe que no próximo quadro o número de grãos de trigo devem ser dobrados ??? Até onde me lembro é assim… Logo, bastaria multiplicar por 2 não é não…

perdoem-me se falei besteira, mas conheci um caso assim quando era muleque…

Falows :wink:

GALACTUS

É esse mesmo véiu, o bagulho é da hora, faz a cabeça da gente explodir de tanto pensar, do geito que eu queria fazer dava muito trabalho pra aplicar o BigInteger e minha lógica estava muito complexa, porém as carinhas aqui do forum me deram umas dicas e já estou fazendo de ouro geito mais facil.

claudneto

Uma dica que meu professor deu foi: faça o programa como vc pensar da primeira vez, depois leia-o de novo e tente melhorá-lo.

GALACTUS

Pode crê véiu, primeiro a gente tem que se ferrar pra depois gozarmos da nossa criação.(tomara que vocês entendam o que eu quis dizer em relação a gozarmos)

Danillo_Moreno

Quando eu preciso resolver um problema eu sempre o escrevo primeiro em modo texto, aplicando a lógica em modo texto e depois eu vou estruturá-lo em código…

GALACTUS

AE galera, já mudei a forma do programa mas sem o BigInteger vejam só:

/* Programa que calcula a quantidade de trigo que pode ser colocado em cada
 * quadro do xadres dobrando a quantidade de trigo em cada quadro */

package trigonoxadres;

import javax.swing.JOptionPane;
public class TrigoNoXadres 
{
    public static void main(String[] args) 
    {
        int quadro=0, // variável que representará cada quadro do tabuleiro do xadrês
             trigo=1, // variável que representará os trigos que serão colocados em cada quadro do xadrês
        trigototal=0; // variável que somará todos os trigos que foram colocados nos quadros do xadrês
        
           for(quadro=1;quadro<=64;quadro++)
           {
                trigototal=trigototal+trigo;
                trigo=trigo*2;
           } 
           JOptionPane.showMessageDialog(null,""+trigototal,"RESULTADO",JOptionPane.PLAIN_MESSAGE);
    }
}

Agora vou fazer a variável trigo e trigo total vivrarem BigInteger pra receber um valor grande e também se foi pelo o que eu intendi eu tenho que fazer uma variavel BigInteger recebendo o numero 2 pra fazer ela vezes o trigo, ummmmmmm acho que vai dar certo agora, vou fazer aqui rapidão.

claudneto

Se a variável que vai multiplicar o trigo é igual a 2…ela não precisa ser BigInteger…pode ser até byte…

GALACTUS

AE GALERA, CACETE, FUNCIONOUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU HAHAHAHAHAHHAHAHAHAHHAH, VALEU MESMO GALERA, PUTS, SE EU TIVESSE DO LADO DE VOCÊS AGORA, EU DARIA UM BEIJÃO EM VOCÊS HAHAHAHAHAHAAHAHA.
VEJAM SÓ:

/* Programa que calcula a quantidade de trigo que pode ser colocado em cada
 * quadro do xadres dobrando a quantidade de trigo em cada quadro */

package trigonoxadres;

import java.math.BigInteger;
import javax.swing.JOptionPane;

public class TrigoNoXadres 
{
    public static void main(String[] args) 
    {
        int quadro=0; // variável que representará cada quadro do tabuleiro do xadrês
        BigInteger trigo=new BigInteger("1"); // variável que representará os trigos que serão colocados em cada quadro do xadrês
        BigInteger trigototal=new BigInteger("0"); // variável que somará todos os trigos que foram colocados nos quadros do xadrês
        BigInteger dobro=new BigInteger("2"); // variável que dobra o valor do trigo
        
           for(quadro=1;quadro<=64;quadro++)
           {
                trigototal=trigototal.add(trigo);
                trigo=trigo.multiply(dobro);
           } 
           JOptionPane.showMessageDialog(null,""+trigototal,"RESULTADO",JOptionPane.PLAIN_MESSAGE);
    }
}

UUUUUUHHHHHHUUUUUUUUUU HAHAHAHAHA, VÉIU, VOCÊS SÃO D+++++++++++, GALERA, VALEU MESMO PELA AJUDA Ó, NEM TENHO PALAVRAS PRA EXPLICAR A MINHA ALEGRIA.

GALACTUS

BOM, O RESULTADO É ESE AQUI Ó:

18446744073709551615

COM CERTEZA ESTÁ CERTO.

T

É isso aí. Boa sorte com a sua lição de casa, e parabéns por ter chegado ao resultado.

claudneto

Bom…eu não quero te ajudar e te conhecer!

Vai que vc me beija mesmo!

=]

Parabéns por ter conseguido…

GUJ sempre ajudando quem precisa!

GALACTUS

Véiu, valeu ó. pelo agora eu sei manipular um POUCO o BigInteger.
Vocês são demais, eu sou fan de vocês, valeu mesmo.

Fernando_Generoso_da

legal!!

Agora se quiser um desafio um pouco maior, tente resolver esse problema recursivamente. :wink:

jpcasati

Fernando Generoso da Rosa:
legal!!

Agora se quiser um desafio um pouco maior, tente resolver esse problema recursivamente. :wink:

HEHEHHE boa!

Você tá afzendo faculdade?

claudneto

Nossa…

Boa idéia…eu vou tentar também!

GALACTUS

Então véiu, estou TENTANDO fazer a facul de c.computação e fui um desastre em pascal e c++, porem eu gostei de mexer com VB e agora to adorando o Java, eu sei algumas coisinhas só de programação e nunca tinha ouvido falar nesse BigInteger, mas a gente vai aprendendo e na sexta-seira vou comprar aquele livro do Deitel “Java Como Programar edição 6”, se a edição quatro é boa a sexta é melhor ainda.

Enquanto a RECURSIVIDADE, véiu, se eu te falasr que eu sei mexer com isso é mentira, eu lembro que vi isso em pascal mas nem sei como éra feito.

Se você me explicar como funciona esse lance de Recursividade eu com certesa vou tentar(até conseguir) fazer o programa.

Valeu.

T

Acho que um problema recursivo mais útil (eu uso isso até hoje) seria tentar listar os subdiretórios de um diretório.

Problema: liste todos os arquivos *.jpg de um diretório com subdiretórios.

GALACTUS

Eu vou dar uma pesquisada aqui no livro da faul e ver esse lance de RECURSIVIDADE.

Valeu.

jpcasati

o mais clássico é o do FATORIAL! huehueuhehue

claudneto

Fatorial e Fibonacci…

Mas pesquisa aqui no GUJ mesmo que vc acha bastante coisa…principalmente nos tópicos sobre Fibonacci!

É um método que chama ele mesmo…(eu acho…pelo menos foi assim que eu entendi…)

Se eu estiver errado…me corrijam…pq dai eu aprendo tbm…

jpcasati

a grosso modo eh isso msm, hehehe

T

Hum… fatorial e fibonacci são aquelas coisas que se usam para ensinar recursividade, mas acho que é exatamente por causa disso que ninguém mais sabe usar recursividade, depois que fez a matéria na faculdade, já que:

  • Não é necessário usar recursividade para calcular tais coisas;
  • Elas são particularmente pouco úteis na sua vida.

Se eu fosse professor de faculdade, provavelmente usaria outros exemplos, mas não fatorial e fibonacci.
Um exemplo que gosto de usar é justamente o de listar subdiretórios (que são ensinadas depois como “busca em profundidade” ou “busca em largura”.)
É que listar subdiretórios é uma coisa bastante útil.

claudneto
jpcasati

thingol:
Hum… fatorial e fibonacci são aquelas coisas que se usam para ensinar recursividade, mas acho que é exatamente por causa disso que ninguém mais sabe usar recursividade, depois que fez a matéria na faculdade, já que:

  • Não é necessário usar recursividade para calcular tais coisas;
  • Elas são particularmente pouco úteis na sua vida.

Se eu fosse professor de faculdade, provavelmente usaria outros exemplos, mas não fatorial e fibonacci.
Um exemplo que gosto de usar é justamente o de listar subdiretórios (que são ensinadas depois como “busca em profundidade” ou “busca em largura”.)
É que listar subdiretórios é uma coisa bastante útil.

Foi com esse exemplo que você citou que há uns tempos atrás “caiu minha ficha” para recursividade!

Fernando_Generoso_da

blz,

Vai ai o meu exemplo…fiz na correria. Certamenta da pra fazer melhor…quem se habilita??

public class ProblemaTrigo {

	public static void main(String args[]) {
		BigInteger total = ProblemaTrigo.calcula(1, new BigInteger("1"),
		        new BigInteger("1"));
		System.out.println(total);
	}

	private static BigInteger calcula(int quadrado, BigInteger qtTrigoAnterior,
	        BigInteger total) {
		if (quadrado == 64) {
			return total;
		}
		return ProblemaTrigo.calcula(++quadrado, qtTrigoAnterior
		        .multiply(new BigInteger("2")), total.add(qtTrigoAnterior
		        .multiply(new BigInteger("2"))));
	}
}
claudneto

Eu tentaria…se eu já tivesse estudado isso antes…

Depois que eu estudar Recursividade direitinho…eu tento!

:roll:

GALACTUS

Demorô, vou dar uma olhada nesse lance de recursividade e vou refazer o meu programa com isso só pra ver como vai ficar!!!

GALACTUS

Ei galera, alguém sabe aonde está a perte de recursividade no GUJ???
Eu procurei não consegui encontrar.!!
Talves alguem saiba melhor aonde está aqui.

GALACTUS

Ei galera, eu acho que não vou me precipitar agora, falta mais dois exercício pra mim fazer de estruturas de repetição.

Tenho que fazer um programa que calcula o fatorial de um número(muito fácil), e o outro é de calcular o MDC entre dois números inteiros diferentes de zero(Também é facil porém eu tenho que lembrar esse lance de MDC).

Todos os programinhas que eu fiz foram feitos com o laço FOR, vou refaze-los com o WHILE porque até agora não o usei o WHILE.

Galera, valeu por tudo, vocês são feras mesmo, qualquer duvida que eu tiver eu apareço por aqui de novo.

Fuiiiiiiiiiiiiiii.

GALACTUS

Ae galera, eu fiz o programinha que calcula o fatorial de um número, e adivinhem só??? Fiz o programa usando o bom e velho BigInteger pro caso de alguém digitar um número mais ou menos assim 5555, véiu, eu testei o programa com esse número e o meu computador quase explodiu na minha cara hahahaha.
Se ligam no código, tá meio bagunçado mas tá feito.

// Programa que calcula o Fatorial de um número
import javax.swing.JOptionPane;
import java.math.BigInteger;
public class Fatorial 
{
	public static void main(String[] args) 
	{
		String numero=JOptionPane.showInputDialog("Digite um número!");
		int num=Integer.parseInt(numero);
		BigInteger fatorial=new BigInteger("1");
		BigInteger n1=new BigInteger("1");
		BigInteger n2=new BigInteger("1");
		int i;
		for(i=1;i<=num;i++)
		{
			fatorial=fatorial.multiply(n1);
			n1=n1.add(n2);
		}
		JOptionPane.showMessageDialog(null,"O fatorial de "+num+" é "+fatorial,"RESULTADO",
				JOptionPane.PLAIN_MESSAGE);
	}
}

Já éra, BigInteger na veia tíu.

Valeu galera, se um dia vocês fixerem um show de rock, pode crê que eu estarei lá vendo vocês hahahaha.

Fuiiiiiiiiiiiii

Criado 25 de setembro de 2008
Ultima resposta 25 de set. de 2008
Respostas 45
Participantes 7