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 - Xandrete

#41
Cita de: Ateius en  1 Marzo 2012, 05:29 AM
gracias por confirmar lo q había encontrado buscando en google.

LOL. Eso sonó un poco mordaz, xDDD
#42
Intenta algo. La premisa aquí es que no se hacen tareas. Si posteas alguna aproximación (aunque sea errónea) al problema, te ayudaremos. En el fondo, sólo necesitas una función que te sitúe el dígito de mayor peso de n en el lugar de las unidades. Inténtalo.

Por otro lado, te puedo decir que la función para detectar si un número es primo se puede mejorar. Sólo necesitas hacer el módulo por los números impares, una vez ya has comprobado que no es divisible por dos. De esta manera, te ahorras sqrt(n)/2 divisiones en el peor de los casos (que es que n sea efectivamente primo). Se puede optimizar más aún, teniendo en cuenta que a partir del 3 todo número primo p cumple que p = 6*k +- 1 para todo k perteneciente a los naturales. Por ejemplo, el 47 es primo y es igual al 6*8-1. El 37 es primo y es igual a 6*6 + 1. De este modo, el número de divisiones que realizas estará acotado por sqrt(n)/3. En un número primo de 8 cifras, la diferencia radica entre hacer unas 10000 divisiones (versión que has posteado), 5000 divisiones (versión que sólo comprueba con los divisores impares) y 3000 divisiones (la última versión que te he propuesto). Aproximadamente, por supuesto. Es sólo para que te hagas una idea.

Sin embargo, lo más óptimo si conoces la cota superior de n (el número máximo para el cual te van a preguntar si es primo o no) es el método conocido como criba de Eratóstenes (busca en la Wiki).

¡Saludos!
#43
Tienes un error. El compilador sólo se queja si compilas con la opción -Wall

Fíjate:

Código (cpp) [Seleccionar]
    int i = 0;
    while (command[i - 1] != 9){
        cin >> command[i];
        i++;
    }


Eso significa que comenzará la iteración  en la posición -1 del array. Malo.

En su lugar, deberías poner algo así como:

Código (cpp) [Seleccionar]
    do {
        cin >> command[i];
        i++;
    } while (command[i - 1] != 9);


O...

Código (cpp) [Seleccionar]
    int i = 0;
    cin >> command[i];
    while (command[i] != 9){
        i++;
        cin >> command[i];
    }


O...

Código (cpp) [Seleccionar]
    int i = 0;
    while (cin >> command[i] and command[i] != 9){
        i++;
    }


Saludos
#44
Programación C/C++ / Re: nodos
3 Marzo 2012, 10:45 AM
Hombre, hay más cosas.

En C++ se incluye iostream y cctype, no iostream.h ni ctype.h.

El main siempre debería ser una función que devuelva un entero, no void main(). Mírate el post con chincheta de "Lo que no se debe hacer en C/C++" o compila con la opción -Wall.

También sobra el conio.h. Todo lo que haces se puede hacer perfectamente con las librerías estándar.

Otra cosa. Estás en C++, no en C. Aquí puedes declarar variables en cualquier parte del código, no hace falta que las declares todas al principio de la función. De hecho, es un buen hábito declarar las variables cuando estrictamente las necesites, en el ámbito de visibilidad donde se vaya a utilizar. Por ejemplo, nuevo y p las podrías haber declarado perfectamente dentro del switch. Además, en C++ tienes las variables de tipo booleano. Puedes declarar existe como bool y así quedaría mucho más clara su función.

Utiliza las etiquetas Geshi para poner el código. Será más fácil de leer para los demás.

Por otro lado, has de tener en cuenta que al eliminar un nodo, el nodo anterior ha de apuntar al nodo que apuntaba el elemento que has eliminado. Es decir: sea Pn el nodo a eliminar, P(n-1) el nodo anterior y P(n+1) el nodo posterior. Pn->sig = P(n+1). Pues bien, has de asegurarte de que antes de eliminar Pn, P(n-1)->sig = P(n+1). Aparte de eso, cometes otro error. En el do-while hay un delete p que lo que hará es eliminar el nodo actual, sea o no el que buscas. Y si lo eliminas, p->sig ya no tiene sentido. El problema es doble: eliminas un nodo que no es el que toca y además no puedes garantizar que puedes acceder al siguiente nodo en la lista.

Para cuando corrijas todo esto, acuérdate de que a la hora de realizar una búsqueda, no hace falta que recorras toda la lista. En cuanto veas que has encontrado el elemento deseado, paras. Tanto en la búsqueda como en la eliminación no has tenido en cuenta esto, y en los dos casos recorres de cabo a rabo la "lista" (que en realidad es una cola).

Saludos
#45
Programación C/C++ / Re: Guardar numero en array
29 Febrero 2012, 16:41 PM
Cita de: Akai en 29 Febrero 2012, 16:27 PM
usa sprintf

http://cplusplus.com/reference/clibrary/cstdio/sprintf/

Supongo que te refieres a guardar el número en un int y luego imprimirlo en un array usando sprintf. Esto no funcionaría si el número es demasiado grande. Me explico. 100000000000000000000000000000000000000000000000000000000000000000000000 es demasiado largo para guardarlo en un int de 64 bits, luego no servirá de nada todo lo que hagas posteriormente. Es mejor leer de la entrada carácter a carácter y guardar cada carácter en un string.
De hecho, para problemas de este tipo hay que hacerlo así (en C/C++).

Saludos
#46
Quizás quieras buscar en la Computense de Madrid o en la Universidad de Barcelona. En general, a alguna universidad pública. Harvard es privada y más aprensiva con sus contenidos >.<
#47
Cita de: Anastacio en 20 Febrero 2012, 18:52 PM
Una preguntita. Eso mediria en segundos, microsegundos, nanosegundos, como mediria?

CLOCKS_PER_SEC => interrupciones de reloj por segundo. Id est, medirá en segundos si no haces ninguna transformación previa.

Cita de: soyloqbuskas en 20 Febrero 2012, 02:11 AM
¡Buenas leophysicist1987!

Tu problema esta en la siguiten linea:
Esta linea debes escribirla asi:
Código (c_mac) [Seleccionar]
duracion = (double)tf - (double)- ti / CLOCKS_PER_SEC;

Ademas el compilador me ha dado un Warning en tu declaracion del main. Deberias escribirlo asi:
int main(){
    //el codigo del programa
    return 0;
}


y ponte un getchar() antes del return, si no se te cerrar el programa en cuanto acabes y no podras ver el resultado de la ejecucion.

Un saludo.

Sólo quería decir que te falta un par de paréntesis y que se te coló un - en la asignación de duracion. Has puesto:  duracion = (double)tf - (double)- ti / CLOCKS_PER_SEC; y sería: duracion = ((double)tf - (double)ti)/ CLOCKS_PER_SEC

Saludos.
#48
Cita de: |Demon| en 21 Febrero 2012, 15:08 PM
He entendido mal o tu te has explicado mal. Lo que quiero saber yo es si es posible que en vez de incrementar en 1 como pones tu en el ejmplo, que se puede incrementar en cualquier valor.

Ni te ha entendido mal, ni te has explicado mal. Su respuesta es totalmente acertada.

for(expr;expr;expr) donde expr puede ser cualquier expresión. Una respuesta más específica: puedes incrementarlo sumándole dos unidades, multiplicarlo por dos, etc. O incluso puedes decrementarlo. O hacer su logarítmo, etc. ¡Lo que quieras!  ;)

Saludos
#49
Joder, casi nos matamos aquí por decidir la manera de encontrar los números impares entre 0 y n. No me imagino las discusiones a la hora de programar una función que compruebe si un grafo contiene un ciclo hamiltoniano.
#50
¿Sobrecarga? No, lo que pasa es que con códigos tan grandes no es difícil equivocarte. Hay códigos cientos de veces más grandes que el tuyo, y si en algún momento tienen algún problema es por algún desliz del programador. Se me ocurre que tal vez tengas un error en la función retardo (como no sé lo que hace exactamente, no te puedo decir). Por otro lado, si tienes 7 funciones iguales que ésta pero cambiando únicamente algunos valores, sugiero poner esta iteración en una función aparte y sustituir los valores concretos por parámetros (que se los pasarías a la función al invocarla). De esta manera, en vez de tener este tocho 7 veces lo tienes una sola vez, y así sería más fácil controlar los fallos, además de que tendrías un código más compacto y, por ende, más legible.

Saludos.