Trigo no xadrês !?!?!?

52 respostas
GALACTUS

Fala galera, tudo firme com vocês?! Então galera, como eu já disse eu sou novato super newba em Java e eu tenho um professor de Java meio xarope que de tanto mexer com Java, já está ficando com cara de Java mesmo hahaha, mas ae, ele virou para a classe e disse assim: “Classe, eu quero jogar com vocês. Vocês tem vinte quatro horas para elaborar o programa proposto, se querem viver, ou façam, ou morram.” Como vocês devem ter percebido é muito embassado ter o John Saw como professor de Java, mas a gente acostuma, se não morrermos.

Bom o programa é o seguinte:

Elaborar um programa que efetue o cálculo e no final apresente o somatório do número de grãos de trigo que se pode obter num tabuleiro de xadrês, obedecendo a seguinte regra: colocar um grão de trigo no primeiro quadro e nos quadros seguintes o dobro do quadro anterior. Ou seja, no primeiro quadro coloca-se 1 grão, no segundo quadro coloca-se 2 grãos(neste momento têm-se 3 grãos), no terceiro quadro colocam-se 4 grãos(tendo neste momento 7 grãos), no quarto quadro colocam-se 8 grãos(tendo-se então 15 grãos) até atingir o sexagésimo quarto quadro do tabuleiro de xadrês.

Eu consegui fazer o programa, não sei se é gambiarra o que eu fiz mas que eu consegui, consegui, está funcionando perfeitamente, vejam:

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=quadro*quadro;
                   for(trigo=trigo;trigo<=n1;trigo*=2)
                   {
                   trigototal+=trigo;
                   n1=0;
                   }
                   
           } 
           JOptionPane.showMessageDialog(null,""+trigototal,"RESULTADO",JOptionPane.PLAIN_MESSAGE);
    }
}

O que eu queria é se tem algum geito de fazer ele menor apenas com o laço FOR ou While, mas só esses dois laços de repetição e sem if, switch, entre outras coisas.??

52 Respostas

claudneto
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=quadro*quadro;   
                   for(trigo=trigo;trigo<=n1;trigo*=2)   
                   {   
                   trigototal+=trigo;   
                   n1=0;   
                   }   
                     
           }   
           JOptionPane.showMessageDialog(null,""+trigototal,"RESULTADO",JOptionPane.PLAIN_MESSAGE);   
    }   
}

Ele não dá erro, mas tbm não dá o resultado correto!

Aparece -1...

E outra...

No segundo for...pq vc colocou trigo = trigo?

Dexa sem nada...

for( ;trigo<=n1;trigo*=2)

Vou tentar consertar seu código!

Consertar ou concertar?

jpcasati

Pelo que entendi…

int soma = 0;
int j = 1;
for (int i=1;i<=64;i++){
    soma = soma + j;
    j = j*2;
}

System.out.println("Total de Grãos de Trigo: "+soma);
rodrigues.danilo

Só para conferir, quantos grãos dá para colocar? rs… Eu tenho uma leve impressão que tá errado… Mas discorde de mim…

Abs!
Danilo

claudneto

Como que só dá -1?
Eu acho que é pq é trigo…

Se mudar pra peças ou peões ele dá certo!

jpcasati

estoura o campo int

rodrigues.danilo

Imaginem assim:

1 2 4 8 16 32… logo são números binários, vão de dois em dois…

2^0 = 1 — 1º quadrado
2^1 = 2 — 2º quadrado
2^2 = 3 — 3º quadrado

2^63 = 9223372036854775808 — 64º quadrado

Ou seja, tá dando overflow no int…

Abs!
Danilo

GALACTUS

Estranho??? O meu está dando 8191 corretamente.

GALACTUS

E testei pelo NetBeans, Jeliot e Pelo Prompt de Comando.
Nos três dá 8191 o total de trigo.

M

GALACTUS:
E testei pelo NetBeans, Jeliot e Pelo Prompt de Comando.
Nos três dá 8191 o total de trigo.

Então seu programa está errado. Tem que dar 18 446 744 073 709 551 615

GALACTUS

PODE CRÊ, e tem algum geito de eu melhorar esse defeito?

T

A resposta não cabe em um long, já que é 2 elevado a 64 menos 1. Faça as contas com BigInteger.

claudneto

long tbm não vai!

tem algo maior?

GALACTUS

E como eu faço isso???

claudneto

Como usar o BigInteger?

GALACTUS

Isso, não tenho a minima ideia de como faz isso??

jpcasati
import java.math.BigInteger;

public class Graos {

    public static void main(String args[]) {

        BigInteger soma = new BigInteger("0");//somatoria final
        BigInteger mul = new BigInteger("2");//multiplicacao do j
        BigInteger j = new BigInteger("1");//inicio da variavel de incremento
        for (int i = 1; i <= 64; i++) {
            //faz o incremento na soma, adicionando ela mesma somando o j
            soma = soma.add(soma.add(j));
            // o j recebe ele vezes 2
            j = j.multiply(mul);
        }

        System.out.println("Total de Grãos de Trigo: " + soma);

    }
}
GALACTUS

AAAAAAA que legal véiu, é assim que usa esse tal de BigInteger, e eu queria saber qual a diferença desse BigInteger pra outros tipos de dados???

M

Mas BigInteger teria que usar um tipo primitivo igual pelo que entendo. Qual seria esse tipo?

GALACTUS

Então galera, esses lances de BigInteger eu não aprendi ainda, talves tem algum geito de fazer sem esse BigInteger né???

GALACTUS

To mais perdido que cego em tiroteio hahahaha.

jpcasati

BigInteger eh uma classe, ela implementa números inteiros grandes, e tem os métodos para manipular estes números e fazer operações com eles.

ivo_costa

[ON-TOPIC] Fala pro teu professor que a quantidade de números não cabe em int , então tu foi na internet achar uma solução e aprendeu a usar o BigInteger.

[OFF-TOPIC] Segue trecho do livro o homem que calculava, do Malba tahan, que tem um problema igual a esse teu:

Nada mais simples - elucidou Sessa. - Dar-me-eis um grão de trigo pela
primeira casa do tabuleiro; dois pela segunda, quatro pela terceira, oito pela
quarta, e, assim dobrando sucessivamente, até a sexagésima quarta e última casa
do tabuleiro. Peço-vos, ó rei, de acordo com a vossa magnânima oferta, que
autorizeis o pagamento em grãos de trigo, e assim como indiquei!
Não só o rei como os vizires e venerandos brâmanes presentes riram-se,
estrepitosamente, ao ouvir a estranha solicitação do jovem. A desambição que
ditara aquele pedido era, na verdade, de causar assombro a quem menos apego
tivesse aos lucros materiais da vida. O moço brâmane, que bem poderia obter do
rei um palácio ou uma província, contentava-se com grãos de trigo!

  • Insensato! - clamou o rei. - Onde foste aprender tão grande desamor à
    fortuna? A recompensa que me pedes é ridícula. Bem sabes que há, num punhado
    de trigo, número incontável de grãos. Devemos compreender, portanto, que com
    duas ou três medidas de trigo eu te pagarei folgadamente, consoante o teu pedido,
    pelas 64 casas do tabuleiro. É certo, pois, que pretendes uma recompensa que mal
    chegará para distrair, durante alguns dias, a fome do último pária1 do meu reino.
    Enfim, visto que minha palavra foi dada, vou expedir ordens para que o
    pagamento se faça imediatamente, conforme teu desejo.
    Mandou o rei chamar os algebristas mais hábeis da corte e ordenou-lhes
    calculassem a porção de trigo que Sessa pretendia.
    Os sábios calculistas, ao cabo de algumas horas de acurados estudos,
    voltaram ao salão para submeter ao rei o resultado completo de seus cálculos.
    Perguntou-lhes o rei, .interrompendo a partida que então jogava:
  • Com quantos grãos de trigo poderei, afinal, desobrigar-me da promessa
    que fiz ao jovem Sessa?
  • Rei magnânimo! - declarou o mais sábio dos matemáticos. - Calculamos
    o número de grãos de trigo que constituirá o pagamento pedido por Sessa, e
    obtivemos um número2 cuja grandeza é inconcebível para a imaginação humana.
    Avaliamos, em seguida, com o maior rigor, a quantas ceiras3 corresponderia esse
    número total de grãos, e chegamos à seguinte conclusão: a porção de trigo que
    deve ser dada a Lahur Sessa equivale a uma montanha que, tendo por base a
    cidade de Taligana, seria cem vezes mais alta do que o Himalaia! A índia inteira,
    semeados todos os seus campos, taladas todas as suas cidades, não produziria em
    2 000 séculos a quantidade de trigo que, pela vossa promessa, cabe, em pleno
    direito, ao jovem Sessa!
Danillo_Moreno

ivo costa:
[ON-TOPIC] Fala pro teu professor que a quantidade de números não cabe em int , então tu foi na internet achar uma solução e aprendeu a usar o BigInteger.

E torce pra ele não ser usuário do GUJ… eheheheh

claudneto

Vai ver, o professor dele é o DONO do GUJ!

Hahaha…

T

É claro que não; se fosse um dos irmãos Silveira (da Caelum), fundadores do GUJ, o Galactus já teria levado um puxão de orelha. De qualquer maneira, eles não ficam dando esses problemas …

claudneto

Pode cre…

Problema retardado…

Se meu professor pedisse isso pra mim eu bateria nele…

GALACTUS

HAHAHAHAHAHHA, VOCÊS SÃO FOGO EM HAHAHAHA, MAS AE, COMO É QUE EU PODERIA FAZER ESSE PROGRAMA SEM ESSE TAL DE BIGINTEGER E COM APENAS O LAÇO FOR???

Danillo_Moreno
jpcasati:
Pelo que entendi...
int soma = 0;
int j = 1;
for (int i=1;i<=64;i++){
    soma = soma + j;
    j = j*2;
}

System.out.println("Total de Grãos de Trigo: "+soma);

Sem o BigInteger faça como jpcasati ensinou...

Mas não irá funcionar pois o número da resposta é grande demais para os tipos primitivos int ou long...

GALACTUS

E se fazer com LONG ou DOUBLE, será que não funciona???

Danillo_Moreno

Teste e veja por você mesmo…

GALACTUS

Ei galera, me fala uma coisa, o total de grãos de trigo é esse aqui ó:

590295810358705651712 ???

M

GALACTUS:
Ei galera, me fala uma coisa, o total de grãos de trigo é esse aqui ó:

590295810358705651712 ???

Já foi postado a solução e a respota no tópico…

GALACTUS

A é pode crê véiu, o resultado é 18 446 744 073 709 551 615, caramba é trigo pra cacete, bom então o programa do jpcasati também tá errado porque ele está dando o outro valor que eu tinha digitado. Caramba, que programa embassado esse véiu, mas eu to tentando fazer essa bagaça, se alguem conseguir ae, dá uma força pra mim beleza, valeu galera.

M

O primeiro programa dele(este abaixo) está funcionando.

int soma = 0;
int j = 1;
for (int i=1;i<=64;i++){
    soma = soma + j;
    j = j*2;
}

System.out.println("Total de Grãos de Trigo: "+soma);

Só que esse não mostra o valor todo. O que tem BigInteger nao testei.

T

Ora, se você sabe que o resultado é 2 elevado a 64 menos 1, ou seja, 18.446.744.073.709.551.615, que é um pouco mais que o dobro do que cabe em um long (2 elevado a 63 menos 1, ou seja, 9.223.372.036.854.775.807, de duas uma:

  • Ou seu professor está confundindo C com Java (no C existe um tipo “unsigned __int64” que tem como valor máximo 18.446.744.073.709.551.615)
  • Ou então ele quer que vocês façam pesquisa e aprendam a usar as capacidades do Java.
GALACTUS

Ou ele anda tomando muita xicara de café ultimamente, mas eu vou tentar aquele outro exemplo. Valeu.

M

O outro exemplo corrigido:

BigInteger soma = new BigInteger("0");//somatoria final
        BigInteger mul = new BigInteger("2");//multiplicacao do j
        BigInteger j = new BigInteger("1");//inicio da variavel de incremento
        for (int i = 1; i <= 64; i++) {
            //faz o incremento na soma, adicionando ela mesma somando o j
            soma = soma.add(j);
            // o j recebe ele vezes 2
            j = j.multiply(mul);
        }

        System.out.println("Total de Grãos de Trigo: " + soma);

    }
GALACTUS

Estranho, esse outro exemplo que o marcio_gs citou está dando -1, caramba, a hora que eu chagar na sala de aula, vou fazer o meu professor comer trigo até ele cair morto no chão, que programa dificil do cacete pra iniciantes.!!!

claudneto

Aqui ainda dá -1…mesmo com BigInteger!

Danillo_Moreno

Está dando -1 por que o numero não cabe no int…

GALACTUS

Agooora sim marcio_gs, o programa está funcionando, porém eu não conheço nada desse tal BigInteger, mas eu vou dar uma pesquisada nisso. Valeu véiu, muito obrigado mesmo.

M

Acho meio improvavel dar -1. Aqui aparece o resultado certinho, então não é overflow. Vocês deram Ctrl+c, Ctr+v ?

EDIT: bom o GALACTUS conseguiu ao menos =)

GALACTUS

Eu testei esse novo que o marcio_gs passou e está funcionando certo, deu:

18446744073709551615.

Mas será que a unica solução é esse tal de BigInteger?? Porque será que o professor passou uma coisa que ainda não aprendemos???

Ele deve ser meio tantan das idéias né???

GALACTUS

Sim, eu dei Ctrl+c, Ctrl+v para ver se funcionava mesmo, e funcionou corretamente esse ultimo.

GALACTUS

Agora, os outros exepmlos não funcionaram, davam outros resultados.

victorwss

Cara, porque que ao invés de ficar fazendo mudanças aleatórias no programa dos outros, sem entender o que está acontecendo, rezando para sair milagrosamente o resultado correto, você não tenta entender o que acontece?

Procure estudar a classe BigInteger e também as restrições de tamanho de byte, short, int, long, float e double para entender porque que usar os tipos primitivos (ou as empacotadoras) não vai dar certo e porque que usar BigInteger dá certo. BigDecimal também funcionaria (descubra porque).

T

No meu tempo programação não era mágica; hoje em dia é difícil passar desse estágio “mágico” da programação - como eu costumo dizer, “POF” ou “programação orientada a fé”.
Se você trabalha em ambiente Microsoft é mais difícil ainda passar da fase POF, já que certas coisas são realmente difíceis de entender como é que dão (ou não dão certo), já que o código-fonte é secreto.

jpcasati

Ele deve ter passado isso pra ver a capacidade de vcs se virarem, correrem atrás das coisas…
Afinal, a documentação tá aí, é só ler e aplicar.

Este com BigInteger que eu fiz funcionou aqui, o outro também está certo, porém, estoura o tamanho de um int.

Eu achei legal o problema, se não fosse necessário usar BigInteger (não sei se tem outro jeito) seria bem aplicado a iniciantes!

GALACTUS

Galera, é o seguinte, eu comecei agora a programar Java, me falaram que esse forum todo mundo ajuda a tirar as duvidas dos outros, por isso eu me registrei aqui, enquanto ao programa que o meu professor passou, se é dificil ou facil eu não sei, só sei que eu tentei fazer ele e até consegui fazer ele do geito que eu pensei, pode ver que a minha lógica está certa, vai lá e veja só, porém eu não sabia que o tipo de dado int não aguentaria tanto numero assim né, agora é BRINCADEIRA o Senhor Inteligente do victorwss falar que eu fico fazendo mudanças aleatórias no programa dos outros e ficar rezando pra funcionar sendo que eu apenas fiz o meu programinha e apenas perguntei se está certo ou se dá pra deixa-lo menor que aquela gambiarra que eu fiz.
Pô, porque esse cara não vai ensinar Java pros carinha que tem sindrome de Dawn já que ele é o bonzão???
Pô, na boa ó, fiquei desanimado com isso véiu, falar que eu pego os programas dos outros pra ficar alterando e falar que fui que fiz é sacanagem ó.
O meu programa é aquele lá que eu postei na primeira mensagem desse tópico aqui e não vou alterá-lo por nada até eu descobrir um geito de fazer a bagaça funcionar corretamente.

Primeiramente que eu não tinha a minima ideia que existe esse tal de BigInteger, aliás eu nem sabia como funcionava o int direito, se eu soube-se eu não teria feito daquele geito.

O meu programa funcionou, deu um resultado e apenas perguntei para o pessoal se está dando o resultado certo e se dá pra deixá-lo menor só isso, agora se tem alguem aqui que está se encomodando ou acha que eu fico COPIANDO as coisas dos outros, é so falar pra mim parar de acesar esse site que eu paro na hora véiu.

Se tem uma coisa nesse mundo que eu não gosto é ficar encomodando os outros e eu sei quando eu estou incomodando os outros véiu.

E quanto as pesquisas, véiu, se tem alguem que procura pesquisar as coisas nesse mundo esse alguem sou e claro todo mundo tambem faz isso.

E nunca na minha vida eu saberia pesquisar sobre BigInteger sendo que eu nem sei mecher com int direito.

E o programa concerteza deve ter alguma forma de fazer sem esse BigInteger e eu vou achar éssa solução mesmo que eu derreta meu cérebro.

GALACTUS

E queria agradecer ao jpcasat pela paciensia comigo e aos demais tabém, valeu.

GALACTUS

AFF, paciencia com s é fogo em.

T

Bom, vou trancar isto aqui, antes que fique desvirtuado.

  • Uma coisa, sr. Galactus, que você precisa aprender, é que professores também cometem erros, porque são gente. Pode ser que ele tenha passado o tal exercício, mas não tenha testado direito antes; senão ele veria que é necessário usar BigInteger para resolver o tal problema.
Criado 24 de setembro de 2008
Ultima resposta 24 de set. de 2008
Respostas 52
Participantes 9