Algoritmos de C.

Hola buenas, necesito ayuda con 4 algoritmos de C. Me he bloqueado y no me sale por ningun lado. Necesito que me ayudeis, si podeis.
Pongo los enunciados y debajo de cada uno lo que es mi idea. Pero con lo mio no es suficiente claro.
Muchas gracias.

1-Escribe un algoritmo que lea números introducidos aleatoriamente por teclado hasta que el valor introducido sea 0. A continuación, deberá visualizar el número de introducciones efectuadas y la mayor secuencia de números consecutivos iguales, indicando cual fue el número y cuantas veces seguidas lo hizo.
"Primero tengo que hacer variables para cada número del 1 al 10. Luego tengo que hacer un bucle para ir comprobando el número de veces que se repite el número introducido (if num = 1 then unos= unos + 1). El contador para la salida es cuando el num vale 0. Con esto ya tienes todos los números contados, que es lo que te pide el ejercicio, ahora solo tengo que hacer otro bucle para comparar cual de las variables es la que más se ha repetido y las veces que lo hizo."

2-Escribe un algoritmo que lea por teclado un numero entero N y otro K, para después mostrar por pantalla el valor de k_enesimo digito del numero empezando por la derecha.
"Tengo que ir dividiendo (mediante un bucle) el resultado introducido entre 10 (para ir separándolo en cachitos) y luego contar los restos o algo así. En la división está el secreto."

3-Escribe un algoritmo que encuentre los tres primeros números perfectos. Un numero perfecto es un entero positivo igual a la suma de todos los enteros positivos (excluido el mismo) que son divisores del numero. El primero número perfecto es el 6= 1+2+3.
"Creo que tengo que ir dividiendo mediante un bucle y comparándolo con la condición de número perfecto (es decir, tienes que jugar con los bucles y con los if para ir recorriendo todos los números y poder encontrar el número perfecto) Luego lo guardas en 3 variables y cuando esas 3 se encuentres termina el programa."

4-Escribe un algoritmo que lea 100 números introducidos por teclado de forma aleatorio y consecutiva. Para cada 10 números introducidos se procederá a mostrar la decencia actual y a la obtención del mayor de los números leídos de la decena. Por último, se deberá obtener el mayor valor introducido y en que decena apareció.
"Creo que el truco está en primero hacer un bucle que te recorra 100 números (supongo que para los números introducidos aleatoriamente podrás usar la función random o randomize con un rango de 0 a 100). Dentro de ese bucle tengo que hacer otro bucle que te vaya guardando 10 números en diferentes variables para luego así poder compararlas y mostrar el mayor número de los leídos (como en el primer ejercicio). Luego lo del final de obtener el mayor número introducido stengo que comparar las variables que has utilizado en los bucles anteriores. Creo que en total son 3 bucles."


Estoy estudiando a distancia, y si no entrego estos 4 no puedo seguir con el siguiente tema. He hecho otros algoritmos de los mismos temas, pero con estos me he bloqueado.

Muchisimas gracias.
Crapos escribió:1-Escribe un algoritmo que lea números introducidos aleatoriamente por teclado hasta que el valor introducido sea 0. A continuación, deberá visualizar el número de introducciones efectuadas y la mayor secuencia de números consecutivos iguales, indicando cual fue el número y cuantas veces seguidas lo hizo.
"Primero tengo que hacer variables para cada número del 1 al 10. Luego tengo que hacer un bucle para ir comprobando el número de veces que se repite el número introducido (if num = 1 then unos= unos + 1). El contador para la salida es cuando el num vale 0. Con esto ya tienes todos los números contados, que es lo que te pide el ejercicio, ahora solo tengo que hacer otro bucle para comparar cual de las variables es la que más se ha repetido y las veces que lo hizo."


No necesitas una variable para cada número del 1 al 10, ni siquiera te dice que el máximo valor sea el 10 ni que no haya números negativos. Suponemos que son números enteros. Además, te pide introducciones consecutivas, no totales para cada número sino total de introducciones.

Primero un bucle que lea un número y termine cuando el número leído sea 0. Necesitas tener unas cuantas variables:
- Número que más veces consecutivas se ha introducido y cuántas veces ha sido
- Número anterior introducido y cuántas repeticiones lleva
- Otra variable que cuente el número de introducciones, que incrementas en cada iteración.

Dentro del bucle has de comprobar si el número introducido es el mismo que el introducido en la iteración anterior, en cuyo caso aumentarías en uno las repeticiones que lleva. Si no es así, modificas la variable que guarda el número anterior introducido, y pones sus repeticiones a 1. En determinado momento del bucle (tienes varias opciones), has de comprobar si el número actual se ha introducido más veces que el que guardas como el número que se ha introducido más veces y, si es así, modificarlo.
amuchamu escribió:
Crapos escribió:1-Escribe un algoritmo que lea números introducidos aleatoriamente por teclado hasta que el valor introducido sea 0. A continuación, deberá visualizar el número de introducciones efectuadas y la mayor secuencia de números consecutivos iguales, indicando cual fue el número y cuantas veces seguidas lo hizo.
"Primero tengo que hacer variables para cada número del 1 al 10. Luego tengo que hacer un bucle para ir comprobando el número de veces que se repite el número introducido (if num = 1 then unos= unos + 1). El contador para la salida es cuando el num vale 0. Con esto ya tienes todos los números contados, que es lo que te pide el ejercicio, ahora solo tengo que hacer otro bucle para comparar cual de las variables es la que más se ha repetido y las veces que lo hizo."


No necesitas una variable para cada número del 1 al 10, ni siquiera te dice que el máximo valor sea el 10 ni que no haya números negativos. Suponemos que son números enteros. Además, te pide introducciones consecutivas, no totales para cada número sino total de introducciones.

Primero un bucle que lea un número y termine cuando el número leído sea 0. Necesitas tener unas cuantas variables:
- Número que más veces consecutivas se ha introducido y cuántas veces ha sido
- Número anterior introducido y cuántas repeticiones lleva
- Otra variable que cuente el número de introducciones, que incrementas en cada iteración.

Dentro del bucle has de comprobar si el número introducido es el mismo que el introducido en la iteración anterior, en cuyo caso aumentarías en uno las repeticiones que lleva. Si no es así, modificas la variable que guarda el número anterior introducido, y pones sus repeticiones a 1. En determinado momento del bucle (tienes varias opciones), has de comprobar si el número actual se ha introducido más veces que el que guardas como el número que se ha introducido más veces y, si es así, modificarlo.


Vale por ahora llego a esto, se que no esta completo ni bien, pero es lo que he avanzado:

int: i, rep=0, total=0, es=0;
Mientras (i!0) hacer:
total = total+1
leer(i)
Si (i==i)
rep = rep+1
Si(es<rep)
es==i

Fin Si
Fin Si
Fin Mientras

Mostrar total
Mostrar rep
Mostrar es
Crapos escribió:4-Escribe un algoritmo que lea 100 números introducidos por teclado de forma aleatorio y consecutiva. Para cada 10 números introducidos se procederá a mostrar la decencia actual y a la obtención del mayor de los números leídos de la decena. Por último, se deberá obtener el mayor valor introducido y en que decena apareció.
"Creo que el truco está en primero hacer un bucle que te recorra 100 números (supongo que para los números introducidos aleatoriamente podrás usar la función random o randomize con un rango de 0 a 100). Dentro de ese bucle tengo que hacer otro bucle que te vaya guardando 10 números en diferentes variables para luego así poder compararlas y mostrar el mayor número de los leídos (como en el primer ejercicio). Luego lo del final de obtener el mayor número introducido stengo que comparar las variables que has utilizado en los bucles anteriores. Creo que en total son 3 bucles."


No se que cosa es la decencia, pero para el resto solo necesitas un bucle. En pseudocódigo.

var mayorDeLos100, mayorDeLos10, indice=0, numeroLeido;
mientras indice<100 hacer:

numeroLeido=leerTeclado();

si mayorDeLos100 es nulo o numeroLeido>mayorDeLos100 entonces:
mayorDeLos100=numeroLeido;
fin si

si mayorDeLos10 es nulo o numeroLeido>mayorDeLos10 entonces:
mayorDeLos10=numeroLeido;
fin si

si indice+1%100=0 entonces:
mostrarPorPantalla(mayorDeLos10);
mayorDeLos10 = nulo;
fin si

fin mientras

mostrarPorPantalla(mayorDeLos100);


No te he dejado el ejercicio completo, me he dejado cosas adrede. Son ejercicios muy fáciles, si te los hacemos no te estamos ayudando, mas bien lo contrario, tenlo en cuenta.
No me gusta hacer los deberes pero bueno, se nota que lo has estado intentando. Para el primero (que no tengo mucho tiempo ahora :S) si lo quieres hacer realmente bien. (mezcla psudocódigo con código) y me falla el teclado no puedo pner corchetes y tal

integer *numIntroducidos=NULL; //por si te apetece guardarte todos aunque no te lo pide
num;
i=0;
numtotal=0;
anterior=-1;
repeticiones=0
masrepetido=-1;
masrepetidocuantas=-1;

numintroducidos = (int *) malloc (sizeof (int))
leer dato introducido y guardas en num
numIntroducidos de i = num //repito, no te hace falta pero queda más pro :P

while (num != 0)

numtotal ++;
if (num == anterior)
repeticiones++;
else
if (repeticiones > masrepetidocuantas)
masrepetidocuantas = repeticiones;
masrepetido = anterior;

repeticiones = 0;
anterior = num;
fin else


leer numero y guardarlo en num
hacer realloc de uno en numIntroducidos
i++;
guardar num en numIntroducidos de i;
fin del while

Pintar los datos liberar y fin



En principio con esto funcionaría si no me he equivocado en nada. El resto de ejercicios son igual de facilitos


EDITO:

Para el dos una forma un poco más profesional sería usando el módulo

Si lo he entendido bien imaginemos que te introducen el número n = 5416 y el k = 3
Primero compruebas que k sea aceptable (como te metan 25 por ejemplo mira que gracia)

Si haces n mod 10 elevado a k+1 te dará como resultado 416.
Si luego divides 416 entre 10 elevado a k te da ya el 4 (división entera, la uqe no devuelve decimales, no me acuerdo si con / o con div, míralo en el man)
Dos pasitos ;) un 10 en el ejercicio :P
Muchas gracias a todos deverdad. Es que no salia del paso y con vuestras ayudas ya si.

Esq a veces te bloqueas y no te sale nada.
Seguire con ello!!!

Millones de gracias a todos !!!!!!
5 respuestas