Questão simples mas que a solução pode surpreender

A primeira solução pensada para um problema normalmente não é a melhor. O enunciado a seguir mostra uma problema simples, mas que precisa ser devidamente analisado para encontrar a solução em sua totalidade e também de forma mais elegante.

====================================

Elabore um algoritmo em linguagem C que determine e mostre a soma dos números inteiros ímpares múltiplos de 3 em um intervalo entre zero e um número informado pelo usuário.

Por exemplo, do número zero até o número 10, os números ímpares e que também são múltiplos de 3 são os números 3 e 9 e cujo a soma dos dois valores resulta em 12.

====================================

Um primeiro pensamento para resolver essa questão normalmente envolve pegar cada valor do intervalo entre zero e o número informado e testar se ele é ímpar (seu resto da divisão pelo número dois é igual a um), ou se ele é múltiplo de três (seu resto da divisão pelo número 3 é igual a zero). O trecho de código a seguir implementa esse raciocínio.

for (i = 0; i <= num; i++) {
    if (i%2==1 && i%3==0) {
         soma+=i;
    }
}

Um pequeno detalhe e que, embora terá pouco impacto no custo computacional, acho importante comentar: por mais que o intervalo seja entre zero é um número informado, o primeiro valor que será ímpar e múltiplo de três é o número três e por isso não é necessário inicializar a variável de controle do laço for com zero, sendo melhor fazer a inicialização com o valor três, ou seja, for (i = 3; i <= num; i++).

Um aspecto realmente significativo na solução e que terá um impacto mais significativo no custo computacional é que existe um incremento fixo entre os valores que obedecem as duas condições apresentadas no problema. Observe que os valores 3, 9, 15, 21, 27 (todos ímpares e múltiplos de três) possuem uma diferença de 6 unidades com relação ao seu sucessor. A codificação dessa solução é mostrada no código abaixo.

#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int soma = 0, i, num;
    scanf("%i", &num);

    for (i = 3; i <= num; i=i+6) { //realiza incremento com passo 6
        printf("%i ", i);
        soma+=i;
    }

    printf("\nSoma: %i", soma); 
    return 0;
}

É importante também perceber no enunciado desta questão que ele não restringiu apenas para o intervalo de números positivos. Supondo que seja fornecido o número -10, então deve ser considerado os números negativos no intervalo decrescente entre zero e dez negativo.

#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int soma = 0, i, num;
    scanf("%i", &num);
    if (num > 0) {
        for (i = 3; i <= num; i=i+6) {
            printf("%i ", i);
            soma+=i;
        }
    } else {
        for (i = -3; i >= num; i=i-6) {
            printf("%i ", i);
            soma+=i;
        }
    }
    printf("\nSoma: %i", soma); 
    return 0;
}

Teste o código em https://ideone.com/gYWRUF

Fica evidente que, se a pessoa não considerar a possibilidade de entrada de um número negativo, sua solução não estará completa. A solução também mostra que, se o programador pensar melhor em sua solução , o algoritmo desenvolvido pode reduzir seu custo computacional.

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.