Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - leosansan

#11
Cita de: crack81 en  8 Noviembre 2014, 07:11 AM
tu codigo espero te sirva y practica mas

Sólo le veo un "pero" a tu propuesta y es que si introduces 123456789  sencillamente se eterniza la respuesta. El problema radica en que después de encontrar el primo mayor, 123456761, sigue comprobando con el 123456760, 123456759, ...... y como  ves son muchos millones de primos a comprobar hasta llegar al 23.

La modificación que propongo lo que hace es, después de localizar al primo mayor más próximo al número introducido, es continuar comprobando desde el número introducido menos el mayor  primo calculado es decir: 12346789 - 123456761 = 28 e inferiores. Como ves se pasa de comprobar millones de números a unas pocas decenas lo que redunda en una mayor velocidad:  :)

Código (cpp) [Seleccionar]
void SumaDePrimos ( int num ) {
 int i , j , flag = 0 ,cont = 0 , suma = 0 ;
 for( i = num ; i >= 1 ; i-- ) {
   for ( j = i ; j >= 1 ; j-- )
      if ( i % j == 0 )
        cont++ ;
   if( cont == 2 || cont == 1 ) {
     suma += i ;
     if ( suma < num )
       printf ( "%d " , i ) ;
     else if ( suma == num ) {
       printf ( "%d " , i ) ;
       break;
     }
     else if ( suma > num )
       suma -= i ;
     if ( flag == 0 ) /* AQUI ESTA LA DIFERENCIA */
       i = num - i , flag = 1 ;
   }
   cont=0;
 }
}


Evidentemente se puede mejorar con sucesivas aproximaciones pero no es plan de hacer la tarea totalmente.

¡¡¡¡ Saluditos! ..... !!!!


#12
Programación C/C++ / Re: Ayuda programa en C!
5 Noviembre 2014, 22:05 PM
Cita de: eferion en  5 Noviembre 2014, 21:49 PM
¿No debería ser un punto y coma en vez de solamente una coma? jejeje

"Creo" que puedes separar instrucciones/funciones, como el scanf y el printf, por una coma sin necesidad de un punto y coma para cada uno de ellos. Vamos, como el declarar varias variables del tipo int, como ejemplo: int i , j , k ;

Cita de: eferion en  5 Noviembre 2014, 21:49 PM
Gran maestro yo??? jajajaja, me halagas.

A cada uno lo que se merece y sí, es un halago a tus profundos conocimientos de C++...y C.

¡¡¡¡ Saluditos! ..... !!!!


#13
Programación C/C++ / Re: Ayuda programa en C!
5 Noviembre 2014, 18:58 PM
Cita de: eferion en  5 Noviembre 2014, 17:41 PM
leosansan, se te coló una coma entre el printf y el scanf.

No se me coló, lo puse así para ahorrar una línea por cada pareja de printf y scanf .  :rolleyes:

Cita de: eferion en  5 Noviembre 2014, 17:41 PM
Por un momento pensé que ibas a meter macros jejejeje

;-) Y dale, ¡Ouggg Gran Maestro!, estando tú presente ni me atrevo a esas cosas.  :)

Un fuerte abrazo amigo eferion.

¡¡¡¡ Saluditos! ..... !!!!


#14
Programación C/C++ / Re: Ayuda programa en C!
5 Noviembre 2014, 17:26 PM
Cita de: crack81 en  5 Noviembre 2014, 02:31 AM
Buenas amigo aqui esta tu codigo lo reutilize del tuyo porque me dio flojerea tenias problemas con las llaves{}
.....................................................

Falta el tipo "int" de la función main.  ;)

¿Y por qué no usar el mismo for de entrada de los datos para ir averiguando la posición? :

Código (cpp) [Seleccionar]
#include <stdio.h>
#include<stdlib.h>

int main ( ) {
 int n , cont , pos = 1 ;
 float vector [ 80 ] ;
 printf ( "Cuantos numeros?: " ) , scanf ( "%d" , &n ) ;
 for ( cont = 0 ; cont < n ; cont++ ) {
   printf ( "x = " ) , scanf ( "%f" , &vector [ cont ] ) ;
     if( cont > 1 && ( abs ( vector [ cont ] - vector [ 0 ] ) ) < abs ( vector [ pos ] - vector [ 0 ] ) )
       pos = cont ;
 }
 printf( "\nLa posicion del mas cercano es: %d\n " , pos ) ;
 return 0;
}


¡¡¡¡ Saluditos! ..... !!!!


#15
Cita de: SilverStun en  3 Noviembre 2014, 03:43 AM

mi duda es por que no me acepta la parte del strcmp gracias de antemano :)


En principio funciona bien, como indica crack81. Eso sí, tienes que ajustar las librerías que en C++ no llevan .h e incluir el using:

Código (cpp) [Seleccionar]
#include <iostream>
# include <conio.h>
# include <cstdio>
# include <cstdlib>
# include <cstring>

using namespace std;


En todo caso dirá, tal como lo tenias, entrada incorrecta porque a la variable usuario no le das entrada, a no ser, tal como hizo crack81 que la declares antes.

Y ya que usas conio.h te puedes ahorrar el uso de dos.h para system cambiando ésta por getch, aunque lo que proceda es no usar la librería conio y sus funciones por no ser parte del estándar de C/C++.

Y sii como indica crack81 usas string has de incluir #include <string> en lugar de #include <cstring> y la comparación puede ser directa, sin el uso de strcmp:

Código (cpp) [Seleccionar]
if(Usuario=="Administrador" && Pass=="stun")

¡¡¡¡ Saluditos! ..... !!!!


#16
Cita de: rir3760 en 31 Octubre 2014, 16:03 PM

----
Toda la explicación es correcta salvo un detalle en esa llamada a función: al utilizar "%c" se debe indicar mediante un puntero la variable donde se almacenara el carácter, si se desea simplemente descartar al susodicho se debe utilizar "%*c".

Un saludo

;-) ;-) ;-)

Gracias por el recordatorio amigo rir3760. No sé que haría sin ti...bueno, sí que lo sé ... ;)

Un fuerte saludo de León.
#17
Cita de: rir3760 en 31 Octubre 2014, 17:08 PM
la condición limite (todos los elementos procesados formando un monte) es "i + 1 == j".
....................................................

"Creo", si no me fallan las cuentas, que con la opción de "ó  : i + 2 == j " cubrirías el caso de un numero impar de elementos.

¡¡¡¡ Saluditos! ..... !!!!



#18
Cita de: pacman22 en 31 Octubre 2014, 04:12 AM
.....................................................
Lo pense dividiendo la lista en la mitad(M). Y recorrerla hasta M , preguntando si el elemento i <i+1 , entonces quedaria la recursion como monte(A[] ,i+1,m).
.....................................................

Creo que es liarla eso de dividir el array en dos partes.

Yo invocaría a la función recursiva con algo como:

Código (cpp) [Seleccionar]
printf( "\n\t%s.\n\n" , Monte ( num , i , sizeof num / sizeof *num - 1 ) == 1 ? "SI es Monte" : "NO es Monte"  ) ;

Y montaría la función recursiva para que diferencie entre la mitad izquierda y la derecha:




EI: codigo borrado, no hagas tareas.




#19
Cita de: francoyo1998 en 30 Octubre 2014, 22:04 PM
y ese while al final y simple??? porque no tiene nada adentro???

Para aclarar eso antes indicarte que cuando escribes del teclado para introducir datos estos no los coge directamente el scanf o función similar, sino que van a lo que se llama buffer o memoria intermedia y es de ahí de donde el scanf toma los datos. pueden ocurrir dos cosas:

* El número de caracteres introducidos es inferior al tamaño del array o dato. En este caso el scanf tomará todos los caracteres del buffer "excepto" el caracter retorno de línea que se quedará en el buffer. Eso hace que al ejecutarse el ciclo al encontrarse el retorno de línea en el buffer se salte el scanf y entre en un bucle infinito. Por lo tanto hay que eliminar el retorno de línea del buffer antes de llegar al scanf nuevamente. Una opción sería poner un getchar, que es una función  que lee un caracter del buffer, después del scanf, algo como:

Código (cpp) [Seleccionar]
#include <stdio.h>

int  main ( void ) {
  char temp [100] ;
  while ( 1 ) {
   printf ( ">>> " ) ;
   scanf ("%[^\n]" , temp) ;
   printf ( "%s\n" , temp ) ;
   getchar ( ) ;           
  }
  return 0 ;
}


O bien, recuerda que he dicho que has introducido menos caracteres que el tamaño del array, hacer que el scanf, al tiempo que lee el dato consuma el retorno de línea del buffer, cosa que podemos conseguir haciendo:

Código (cpp) [Seleccionar]
#include <stdio.h>

int  main ( void ) {
  char temp [100] ;
  while ( 1 ) {
   printf ( ">>> " ) ;
   scanf ("%[^\n]%c" , temp) ;
   printf ( "%s\n" , temp ) ;           
  }
  return 0 ;
}


Fíjate que el scanf lee la cadena y otro caracter que sería el retorno de línea y de esa forma eliminamos el mismo del buffer y ya no dará problemas.

* Pero si el total de caracteres que introduces es superior al tamaño máximo que has declarado en el array, ahora hay que eliminar ese exceso. En este caso es cuando es útil el bucle del while con el getchar ya que mientras quede algún caracter en el buffer el getchar los irá consumiendo hasta limpiar el buffer de forma que cuando termina se ejecuta el while principal y el scanf funciona sin problemas al no haber ya nada previo en el buffer, con lo que procede a leer el nuevo dato introducido.

Y así sucesivamente.

Espero no haberte liado más, sino todo lo contrario y no haber metido la pata con la explicación que a fuerza de ser breve puede ocurrir.

Un fuerte saludo francoyo1998 .

#20
Creo que lo has interpretado de forma adecuada, sólo un par de observaciones:

* Como main es una función de tipo int requiere de un return.

* En:

Código (cpp) [Seleccionar]
if(n2<=2027 && n2>=997)

te sobra lo de n2<=2027 ya que es una condición del for.

* Es más, el for,  si n = 123 en lugar de empezarlo por 1 lo empezaría por 9 porque fíjate que si n es 123 estarías probando:
123 * 1 = 123 < 997==> no se imprime.
123 * 2 = 246 < 997==> no se imprime.
........................................................
123 * 8 = 984 < 997==> no se imprime.
123 * 9 = 1107 > 997==> SI se imprime.

Y ese "9" es ni más ni menos que: 1 + 997 / n, en este ejemplo más concreto con n= 123 sería 1 + 997 / 123, con lo que ahorrarías cálculos innecesarios y además te sobraría el if anterior.

* De paso te puedes ahorrar la variable n2.

* Procura indentar el código de forma racional.  ;)

Yo te propondría:

Código (cpp) [Seleccionar]
#include <stdio.h>

int main ( void ) {
 int i , n ;
 printf ("introduzca el numero: " ) ;
 scanf ( "%d" , &n  );
 if( n < 2027 ) {
   for ( i = 1 + 997 / n ; i * n < 2027 ; i++ )
     printf ( "%d " , i * n ) ;
 }
 else
   puts ( "No hay multiplo en el intervalo deseado" ) ;
 putchar ( '\n' ) ;
 return 0 ;
}


¡¡¡¡ Saluditos! ..... !!!!