aula 91

Exercício 20 | Quantos grãos de trigo a rainha pagou ao monge?

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

Deixe um comentário

treze + quinze =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.