Hola!
... que haya contenidos en un número dado por el usuario.
Si digito un 9 la suma de sus múltiplos debería dar 3+6+9=18
Yo diría mejor
contenidos en un rango empezando desde 3 hasta un número (mayor o igual que 3) dado por el usuario.
La sintaxis de la instrucción de control "for", a no dudarlo, una de las señales más características del lenguaje C, sobretodo porque es tan versátil que su expresividad es equivalente a la de la instrucción "
while"...
Esto no era así en otros lenguajes de su época, como el mítico
Pascal, en el que se usaba como
azucar sintáctico de una construcción
while particular (donde había
una variable contadora "n", que se comparaba contra una expresión "n=e(...)" y se incrementaba o disminuía en un valor constante 1,2...)
Tiene 4 partes
for (init; B ; step) body
que vienen a coincidir con lo que en algoritmia clásica se conoce como
- init : donde se dan valores a las variables al principio
- B : guarda que determina cuándo termina su ejecución. (Después del init y del step en segundas vueltas)
- step : incremento de variable, para que el bucle progrese hacia su terminación (después del body)
- body: aproxima el cómputo parcial a la solución definitivadespues de evaluar la guarda y antes de step
En el cuerpo del bucle pueden aparecer instrucciones como
break; o
continue, y aunque muy útiles en programación se sistemas y en el mundo real, en
algoritmia clásica son el "patito feo" que rompe la llamada "programación estructurada" o "composicional"... Pero esto es otro tema aparte..... C no fue hecho para estudiar algoritmia, sino para la programación de sistemas operativos, y es ahí donde encuentran todo su valor...
Ahi va una solución a tu problema.
Los comentarios tienen más importancia en cursos avanzados de algoritmia. Por el momento fífate en la rutina
mult3. Después intenta programarla en sentido descendente (con nn--...)
#include <stdio.h>
#include <assert.h>
/*
P : M >= 3
Q : c = sum i : 3 <= i <= M and (i%3==0) : i
I : Q[M/n] and 3 <= n <= M
B : n < M
Quota (n) = M - n >= 0
Step : n = n + 1
Restore : c = c + (n+1)*\chi((n+1)%3==0)
*/
#define DEBUG
unsigned int mult3(const unsigned int N)
{
unsigned int n,c;
#ifdef DEBUG
#endif
for(n=c=3;n<N;n++)
{
if (((n+1)%3==0)) c+=(n+1);
#ifdef DEBUG
if ((n
+1)%3==0) printf("%d ",n
+1); #endif
}
return c;
}
int main()
{
unsigned int M;
int e;
for ( ; (e
=scanf("%u",&M
))==1;) if (e!=EOF)
{
return -1;
}
return 0;
}
La salida que da el programa es:
3
3 --> 3
4
3 --> 3
5
3 --> 3
6
3 6 --> 9
7
3 6 --> 9
8
3 6 --> 9
9
3 6 9 --> 18
10
3 6 9 --> 18