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.