Bem vindo a aula 91 de nosso curso gratuito de programação com a linguagem C.
Na aula de hoje vamos continuar a resolução da nossa lista de exercícios fazendo um programa para descobrir quantos grãos de trigo a rainha pagou ao monge.
20) Uma rainha requisitou os serviços de um monge e disse-lhe que pagaria qualquer preço. O monge, necessitando de alimentos, indagou à rainha sobre o pagamento, se poderia ser feito com grãos de trigo dispostos em um tabuleiro de xadrez (que possui 64 casas), de tal forma que o primeiro quadro deveria conter apenas um grão e os quadros subsequentes, o dobro do quadro anterior. Crie um programa para calcular o total de grãos de trigo que o monge recebeu.
#include <stdio.h> #include <stdlib.h> int main() { int i; long double somatorio = 1, inicio = 1; for(i = 2; i <= 64; i++){ inicio = inicio * 2; somatorio += inicio; printf("%d Valor: %Lf\n", i, inicio); __mingw_printf("%d Valor: %Lf\n", i, inicio); } printf("->Valor: %Lf\n", somatorio); __mingw_printf("->Valor: %Lf\n", somatorio); return 0; }
Este exercício, apesar de fácil, ele possui uma pegadinha especialmente para aqueles mais desatentos.
Perceba que a resposta do exercício, a quantidade de grãos pago pela rainha, é o somatório dos grãos de cada casa:
1 na primeira casa +
2 na segunda casa +
4 na terceira casa +
8 na quarta casa +
16 na quinta casa +
… até a casa 64
O resultado desse somatório é um número tão grande que não é possível armazena-lo em uma variável do tipo long long int (isso pode varia dependendo da arquitetura do seu computador).
Dessa forma, precisamos de uma variável com mais memória:
long long int -> 8 bytes
long double -> 16 bytes
Aí nos deparamos com outro problema, agora relacionado a sistema operacional. Se você está programando em uma distribuição Linux, provavelmente você não encontrará problema para imprimir um número long double na tela assim:
// imprimindo um número long double na tela printf("->Valor: %Lf\n", somatorio);
Porém, se você está programando no Windows, o sistema não suporta a impressão de um número tão grande. Ao executar o printf acima será impresso na tela o valor 0. Neste caso, precisamos usar um recurso do compilador GCC, uma função do compilador para imprimir esse número, assim:
// função do compilador para imprimir números longos __mingw_printf("->Valor: %Lf\n", somatorio);