Trigo no xadrês !?!?!?

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.??

[code]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=quadroquadro;
for(trigo=trigo;trigo<=n1;trigo
=2)
{
trigototal+=trigo;
n1=0;
}

       }   
       JOptionPane.showMessageDialog(null,""+trigototal,"RESULTADO",JOptionPane.PLAIN_MESSAGE);   
}   

}[/code]

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?

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);

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

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

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

estoura o campo int

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

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

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

[quote=GALACTUS]E testei pelo NetBeans, Jeliot e Pelo Prompt de Comando.
Nos três dá 8191 o total de trigo.[/quote]

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

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

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

long tbm não vai!

tem algo maior?

E como eu faço isso???

Como usar o BigInteger?

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

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);

    }
}

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???

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

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