¿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)
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.
Parece que nadie se anima:
Miren una posible solución al ejercicio nº 1
(http://img20.imageshack.us/img20/6088/sinttulo.png)
Citardos 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 ;)
Hola ny0X...
Si quieres puedes leerte esto...
http://foro.elhacker.net/programacion_general/algoritmia_metodos_para_resolucion_de_problemas-t254890.0.html
CitarProblema 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...
CitarEj:
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.
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 ... :¬¬
Citarlo 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 -).
Citaren cuanto a la resolucion de problemas creo que lo lei en un libro de C++
Mmm, yo lo saque de unos apuntes de algoritmia.
CitarPero 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!
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!
Al parecer nadie se anima o parece que no es familiar este subf pero he aqui la respuesta.
{Mostrar los k primeros numeros naturales que verifiquen la condicion
de poseer una cantidad impar de divisores}
variables
i,k,num son enteros;
flag es logico;
inicio
escribir "Ingrese k: ";
leer k;
i=1;
num=0;
flag=verdadero;
mientras flag==verdadero hacer
inicio
si (i^1/2)==redondear(i^1/2) entonces
inicio
escribir i,"; ";
num=num+1
final;
si num==k entonces
flag=falso;
i=i+1;
final;
final
En C++
#include <iostream>
#include <math.h>
using namespace std;
int k,num;
double i,result;
bool flag;
int main()
{
i=1;
num=0;
flag=1;
cout << "Ingrese numero" << endl;
cin>>k;
while (flag==1)
{
result=sqrt(i);
if(result==((int)result))
{
cout<<i<<"; ";
num++;
}
if(num==k)
{
flag=0;
}
i++;
}
system("PAUSE");
return 0;
}
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 ;)
Mmm es algo parecido claro a lo que hice, pero tu te refieres a lo siguiente?:
For(i=0;i<=K;i++)
{
x=i^2;//En c++ no es i^2 pero basta con agregar una función
cout<<x<<";"<<endl;
}
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 ;)
Tienes razón... Muchas gracias :)
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!!!!!!!!!
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:
Ahi va la solucion:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[])
{
unsigned long fact1=1,fact2=1,i=1;
char num1[50],num2[50];
int difCifras; /*no creo que un unsigned long tenga tantas cifras :P*/
do{
printf("Introduce la diferencia de cifras entre dos factoriales consecutivos: ");
fflush(stdin);
scanf("%d",&difCifras);
}while(difCifras<0);
do{
fact1*=i;
fact2=fact1*(i+1);
sprintf(num1,"%lu",fact1);
sprintf(num2,"%lu",fact2);
i++;
if(i==13) /*13! excede la capacidad de un usigned long*/
break;
}while(strlen(num2)-strlen(num1) < difCifras);
i--;
if(i!=12)
printf("%d! y %d! se diferencian en %d cifras\n"
"%d!=%lu\n"
"%d!=%lu\n",i,i+1,difCifras,i,fact1,i+1,fact2);
else
printf("No se dispone de tanta capacidad de calculo.\n");
system("PAUSE");
return 0;
}
Espero que sirva de algo!!
Un saludo!!!!!