Programação Back end

Desenvolva um algoritmo que calcula o número de grãos de trigo dispostos num tabuleiro de xadrez e que segue a seguinte regra: no primeiro quadro, colocar um grão de trigo; no segundo quadro, colocar o dobro de grãos de trigo do primeiro quadro; e, para todos os quadros subsequentes, colocar o dobro de grãos de trigo do quadro anterior. Um tabuleiro de xadrez tem 64 quadros.

Me ajudem a desenvolver, por favor

O tabuleiro é uma matriz.

Tenta fazer algo e posta o código para nós?

1 curtida

var g = 1;
var s = 0;

while (g<64){
s = s * 2;
s = s + g;
g = g + 1;
}

document.write ("A quantidade de grãos no tabuleiro é: " + s);

Na verdade nem precisaria de nenhum algoritmo, somente matemática.

Primeiro vamos ver quantos grãos cabem em cada casa:

Nº da casa Quantidade de grãos desta casa
1 1 = 20
2 2 = 21
3 4 = 22
4 8 = 23
n 2n - 1

Ou seja, se quisermos saber o total de grãos para N casas, basta somar as potências de 2 até N - 1. E tem uma fórmula pra isso:

20 + 21 + 22 + … + 2n - 1 = 2n - 1

Ou seja, total de grãos seria:

Nº de casas Quantidade total de grãos
1 1 = 21 - 1
2 3 = 22 - 1
3 7 = 23 - 1
4 15 = 24 - 1
n 2n - 1

Portanto, para um tabuleiro com 64 casas, o total de grãos é 264 - 1.

O problema é que esse número é grande demais para o Number do JavaScript. O maior valor possível (sem dar problemas) é Number.MAX_SAFE_INTEGER, que equivale a 253 - 1. Para valores maiores a própria documentação recomenda que se use BigInt.

Ou seja, seria apenas isso:

console.log('O total de grãos é:', 2n ** 64n - 1n);

Repare que os números possuem o sufixo n: ele indica que o valor deve ser tratado como um BigInt em vez de Number. A saída será:

O total de grãos é: 18446744073709551615n

Se você não usar BigInt (ou seja, 2 ** 64 - 1) o resultado será 18446744073709552000 (o valor é truncado porque ultrapassa o limite Number.MAX_SAFE_INTEGER).


Mas se quiser muito fazer um algoritmo (que como já disse, é desnecessário, pois já conhecemos a fórmula que dá a resposta diretamente), seria algo assim:

var total = 0n;
var qtd = 1n; // quantidade de grãos na casa atual
for (var i = 1; i <= 64; i++) {
    total += qtd;
    // na casa seguinte, a quantidade de grãos dobra
    qtd *= 2n;
}
console.log('O total de grãos é:', total);

Repare que também tive que usar BigInt para não cair no problema dos valores truncados.

3 curtidas

Obrigada, é que tinha que fazer algoritmo em java script mesmo. Valeu pelas explicações e alternativas!