Foro de elhacker.net

Programación => Ejercicios => Mensaje iniciado por: Myth.ck en 14 Mayo 2009, 03:41 am



Título: Ejercicios Básicos
Publicado por: Myth.ck en 14 Mayo 2009, 03:41 am
¿Como resolverian los siguientes ejercicios?

A través de pseudocódigo o c++.

Problema 1: Dado un número natural K, mostrar los dos primeros naturales consecutivos A y B tales que A! y B! tengan una cantidad de dígitos que se diferencian al menos en K.

Problema 2: Dado un número natural K, mostrar los dos naturales consecutivos A y B tales que K €[A!,B!]

Suerte!

Jeje el € es el símbolo de pertenece.

Un ejemplo de pseudocódigo que hice:
Dado un número natural K, y un número natural F, mostrar el resultado de
(P-Q) mientras sea menor que K, donde:
P=(-1)E*E*F
Q=(-1)E+1*(E+1)*F
E = 0, 1, ...

(http://img183.imageshack.us/img183/8440/algoritmo.jpg)



Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 14 Mayo 2009, 22:50 pm
Como ayuda...

Problema 1:

E: K. Cond. sobre E: K es natural.
S: A y B.   Cond. sobre S: |A!-B!|>=K, A y B son consecutivos, AyB son los menores.
Caso de prueba:
CP1) Entrada: K=5 Salida: A=2, B=3.
CP2) Entrada: K=4 Salida: A=2, B=3.

Problema2:
E: K.Cond. sobre E: K es natural.
S: A y B.   
Cond. sobre S: A y B son consecutivos. K €[A!,B!].
Casos de Prueba:
CP1) Entrada: K=5 Salida: A=2, B=3.
CP2) ) Entrada: K=2 Salida: A=2, B=3.

Espero que les ayude en algo.




Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 15 Mayo 2009, 03:46 am
Parece que nadie se anima:

Miren una posible solución al ejercicio nº 1

(http://img20.imageshack.us/img20/6088/sinttulo.png)


Título: Re: Ejercicios Básicos
Publicado por: ny0x en 15 Mayo 2009, 04:02 am
Citar
dos naturales consecutivos A y B tales que K €[A!,B!]
(P-Q) mientras sea menor que K, donde:
P=(-1)E*E*F
Q=(-1)E+1*(E+1)*F
E = 0, 1, ...
WTF? demasiadas matematicas para mi cerebro  :P , a mi todavia no me enseñan calculo (creo que eso es) o si no si me animo  ;)


Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 15 Mayo 2009, 04:15 am
Hola ny0X...

Si quieres puedes leerte esto...

http://foro.elhacker.net/programacion_general/algoritmia_metodos_para_resolucion_de_problemas-t254890.0.html

Citar
Problema 1:
E: K. Cond. sobre E: K es natural.
S: A y B.   Cond. sobre S: |A!-B!|>=K, A y B son consecutivos, AyB son los menores.
Caso de prueba:
CP1) Entrada: K=5 Salida: A=2, B=3.
CP2) Entrada: K=4 Salida: A=2, B=3.

Los numeros naturales son todos los numeros mayores a 0 y que son enteros. En realidad son los que usamos para contar... 1,2,3,4...999...2560...

Luego Tu salida tiene que ser A y B al menos con diferencia igual a K con a y b consecutivos

La diferencia de estos siempre es positiva...

Citar
Ej:
A=1(primer numero natural) B=A+1=>B=2
A=1 B=2
El factorial se calcula por ejemplo 1!= 1x1 y 2!=2x1
A!-B!=1-2=-1 pero con |-1| el -1 se hace "1"=> A!-B!=1

Con respecto a

(P-Q) mientras sea menor que K, donde:
P=(-1)E*E*F
Q=(-1)E+1*(E+1)*F
E = 0, 1, ...

P-Q es una simple resta.
a la variable P se le asigna la expresion (-1)E*E*F
a la variable Q se le asigna la expresion (-1)E+1*(E+1)*F

Luego E=0,1,2 indica que E ira incrementando, por lo tanto ahi te das la idea que es un contador.

Espero que te haya servido de ayuda. Puedes consultar cualquier cosa.

PD: Para resolver estos problemas, siempre es bueno identificar bien el problema, es decir, identificar los terminos que no conoces, y luego dar un caso de prueba, que generalmente es un "supuesto" resultado que esperas ver en la salida de tu programa.


Título: Re: Ejercicios Básicos
Publicado por: ny0x en 15 Mayo 2009, 04:35 am
lo que me confunde son los terminos, eso de numeros reales, naturales, conjunto no se que ...
en cuanto a la resolucion de problemas creo que lo lei en un libro de C++, creo que es la edicion especial de "El lenguaje de programacion c++" por bjarne stroupstrup. Ahi recomienda lo que tu dices, pero como cuando yo lei eso ya tenia el mal habito de escribir lo que se me ocurra sin planearlo antes. A causa de eso me he dado una de roturas de cabeza ...  :P. Pero bueh cuando aprendes solo no tienes muchas opciones, ni quien te guie  :-\
gracias, por los links saludos
P.D A practicar algoritmos ...  :¬¬


Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 15 Mayo 2009, 13:23 pm
Citar
lo que me confunde son los terminos, eso de numeros reales, naturales, conjunto no se que ..
Reales, naturales, enteros... Son solo tipos de conjuntos.

(http://img194.imageshack.us/img194/5011/96a31a3018c83f4f4cbb73a.png)

Lo que tiene cada conjunto es que varían las propiedades de cada uno, y los "números" por decirlo así, que habitan en cada uno. Eso no es mucho problema, si todavía no tienes mucha idea solo basta con que trabajes unicamente con reales, cuyas propiedades son las que conoces, y los números incluyen los fraccionarios y enteros(+ y -).

Citar
en cuanto a la resolucion de problemas creo que lo lei en un libro de C++
Mmm, yo lo saque de unos apuntes de algoritmia.

Citar
Pero bueh cuando aprendes solo no tienes muchas opciones, ni quien te guie .
Si te refieres sólo a eso de escribirlo en un papel, yo generalmente cuando me inicié, no tenía a nadie que me guíe, pero igualmente lo tomé como hábito cuando no entendía ciertas cosas.

Salu2!


Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 19 Mayo 2009, 01:37 am
Aqui un nuevo reto, espero que lo resuelvan rápido aplicando el mejor método.  :xD

Mostrar los k primeros numeros naturales que verifiquen la condicion de poseer una cantidad impar de divisores

Suerte!


Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 22 Mayo 2009, 01:17 am
Al parecer nadie se anima o parece que no es familiar este subf pero he aqui la respuesta.

Código
  1. ;
  2. ;
  3. "Ingrese k: ";
  4. ;
  5. ;
  6. ;
  7. ;
  8. "; ";
  9. ;
  10. ;
  11. ;
  12. ;    
  13.  


Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 22 Mayo 2009, 01:17 am
En C++

Código
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4. using namespace std;
  5.  
  6. int k,num;
  7. double i,result;
  8. bool flag;
  9.  
  10. int main()
  11. {
  12.    i=1;
  13.    num=0;
  14.    flag=1;
  15.    cout << "Ingrese numero" << endl;
  16.    cin>>k;
  17.    while (flag==1)
  18.    {
  19.        result=sqrt(i);
  20.        if(result==((int)result))
  21.        {
  22.            cout<<i<<"; ";
  23.            num++;
  24.        }
  25.        if(num==k)
  26.        {
  27.            flag=0;
  28.        }
  29.        i++;
  30.    }
  31.    system("PAUSE");
  32.    return 0;
  33. }


Título: Re: Ejercicios Básicos
Publicado por: ghastlyX en 24 Mayo 2009, 02:10 am
Este código no es muy eficiente...

Sabemos que un número tiene un número impar de divisores si y sólo si es un cuadrado perfecto.

En vez de ir número a número y ver si es un cuadrado, es más fácil directamente coger los k primeros números y mostrar sus cuadrados. Como yo digo haces k iteraciones, como tú haces estás mirando hasta el último de los cuadrados perfectos, es decir, k2 iteraciones.

Un saludo de ghastlyX ;)


Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 24 Mayo 2009, 02:17 am
Mmm es algo parecido claro a lo que hice, pero tu te refieres a lo siguiente?:

Código
  1. For(i=0;i<=K;i++)
  2. {
  3.    x=i^2;//En c++ no es i^2 pero basta con agregar una función
  4.    cout<<x<<";"<<endl;
  5. }


Título: Re: Ejercicios Básicos
Publicado por: ghastlyX en 24 Mayo 2009, 02:33 am
Sí, así te ahorras tener que pasar por cada uno de los cuadrados. Habría que decidir si el cero es o no es cuadrado perfecto. Si lo consideras cuadrado perfecto, sería el bucle hasta K - 1 incluído, si no empezaría en 1 y sería hasta K.

Un saludo de ghastlyX ;)


Título: Re: Ejercicios Básicos
Publicado por: Myth.ck en 24 Mayo 2009, 02:36 am
Tienes razón... Muchas gracias :)


Título: Re: Ejercicios Básicos
Publicado por: Eliptico en 28 Mayo 2009, 01:18 am
Buenas!!!!!!

Solo quiero dejar una pequeña explicacion sobre el primer y el segundo problema:

1º) Si bucamos don numeros naturales consecutivos cuya diferencia se k se tendra que

k=(n+1)!  - n! = (n+1)*n! - n! = ( (n+1) - 1) * n! = n*n!

Es decir, existira n natural cumpliendo (n+1)! - n! = k si y solo si k=n*n!

es decir, si existe un natural n tal que k=n*n! entonces existen el A=n y el B=(n+1) que se buscan, si no no.

2º)
sea N={n naturales| k>=n!}

N es un conjunto de naturales acotado superiormente por k, por lo tanto tendra un maximo m cumpliendo que m! <= k.

(m+1) no puede estar en N, ya que si estubiese seria m! < (m+1)! <= k, lo cual seria contrdictorio con que m fuese maximo.

Por lo tanto (m+1) no pertenece a N y (m+1) no puede cumplir la condicion (m+1)!<=k luego (m+1)! > k

Es decir. 2 soluciona cuando se encuentra el primer n natural tal que n!>k, y en este caso se tendra que A=(n-1) y B=n.

Bueno, como el intervalo es cerrado por ambos lados, si (n-1)! = k  se tendra que [(n-2)! , (n-1)!] tambien cumplen las condiciones del problema
(A=(n-2) , B=(n-1)).

Ahora los dos problemas son mas faciles, ¿No?

Un saludo!!!!!!!!!


Título: Re: Ejercicios Básicos
Publicado por: Eliptico en 28 Mayo 2009, 08:46 am
Huy, vaya rayada con el primer problema. jejejeje. Lo he entendido y mal y lo he puesto patas arriba.   :-[

A ver si lo corrijo qu la solucion no es tan matematica   :silbar:


Título: Re: Ejercicios Básicos
Publicado por: Eliptico en 28 Mayo 2009, 09:27 am
Ahi va la solucion:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(int argc,char* argv[])
  6. {
  7.    unsigned long fact1=1,fact2=1,i=1;
  8.    char num1[50],num2[50];
  9.    int difCifras; /*no creo que un unsigned long tenga tantas cifras :P*/
  10.  
  11.    do{
  12.        printf("Introduce la diferencia de cifras entre dos factoriales consecutivos: ");
  13.        fflush(stdin);
  14.        scanf("%d",&difCifras);
  15.    }while(difCifras<0);
  16.  
  17.    do{
  18.        fact1*=i;
  19.        fact2=fact1*(i+1);
  20.  
  21.        sprintf(num1,"%lu",fact1);
  22.        sprintf(num2,"%lu",fact2);
  23.  
  24.        i++;
  25.        if(i==13) /*13! excede la capacidad de un usigned long*/
  26.            break;
  27.    }while(strlen(num2)-strlen(num1) < difCifras);
  28.  
  29.    i--;
  30.  
  31.    if(i!=12)
  32.        printf("%d! y %d! se diferencian en %d cifras\n"
  33.        "%d!=%lu\n"
  34.        "%d!=%lu\n",i,i+1,difCifras,i,fact1,i+1,fact2);
  35.    else
  36.        printf("No se dispone de tanta capacidad de calculo.\n");
  37.    system("PAUSE");
  38.  
  39.    return 0;
  40. }
  41.  

Espero que sirva de algo!!

Un saludo!!!!!