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.