Autor
|
Tema: Program java numeros primos (Leído 87,136 veces)
|
^Tifa^
Desconectado
Mensajes: 2.804
|
43H4FH44H45H4CH49H56H45H yo creo que deberias hablar menos y aportar mas No creo que seas tu la persona mas adecuada para comentar aca como deberia y como no alguien programar un codigo, sobretodo porque observando tu pequeno 'ejemplo' lo mismo que criticas en mi lo estas aplicando en tu codigo.... yo esperaba al menos, ya que te tomas la molestia de criticar algo redundante que tu tambien estas aplicando, yo espera al menos ver que tu creases tu propia funcion independiente que funcionase como un bucle y una sentencia de control de flujo a la vez... al menos si criticas algo, ten con que respaldarlo, sino tienes con que respaldarlo mejor no digas nada. Yo se perfectamente como funciona una sentencia de control de flujo y es totalmente valido usarlo dentro de un bucle for como lo idealize en mi codigo (aunque imprima numero pares/impares y no primos). En lo unico que te doy la razon es en lo de numero primo. Pero no en el concepto de la forma como hice el codigo. Un saludo.
|
|
« Última modificación: 27 Noviembre 2008, 15:21 pm por ^TiFa^ »
|
En línea
|
|
|
|
-Ramc-
Desconectado
Mensajes: 495
|
43H4FH44H45H4CH49H56H45H tu algoritmo no es muy bueno, ademas de que el break en muchos casos quiere decir que la condición de parada de tu bucle no es la correcta, otra cosa, te recomiendo usar Scanner en vez del InputStreamReader, yo propongo este algoritmo para comprobar si un numero es primo: public boolean esPrimo(int numero) { double raiz = Math. sqrt(numero ); for(int i = 2; i <= raiz; i++) { if/numero % i == 0) return false; } return true; }
Si a alguien le sirve, simplemente lo envias en un for y listo, guardas en un arreglo los que te devuelvan true.
|
|
« Última modificación: 27 Noviembre 2008, 15:47 pm por -Ramc- »
|
En línea
|
Shhh... be vewy, vewy, quiet! I'm hunting wabbits...LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.
|
|
|
43H4FH44H45H4CH49H56H45H
Wiki
Desconectado
Mensajes: 502
|
43H4FH44H45H4CH49H56H45H yo creo que deberias hablar menos y aportar mas No creo que seas tu la persona mas adecuada para comentar aca como deberia y como no alguien programar un codigo, sobretodo porque observando tu pequeno 'ejemplo' lo mismo que criticas en mi lo estas aplicando en tu codigo.... yo esperaba al menos, ya que te tomas la molestia de criticar algo redundante que tu tambien estas aplicando, yo espera al menos ver que tu creases tu propia funcion independiente que funcionase como un bucle y una sentencia de control de flujo a la vez... al menos si criticas algo, ten con que respaldarlo, sino tienes con que respaldarlo mejor no digas nada. Yo se perfectamente como funciona una sentencia de control de flujo y es totalmente valido usarlo dentro de un bucle for como lo idealize en mi codigo (aunque imprima numero pares/impares y no primos). En lo unico que te doy la razon es en lo de numero primo. Pero no en el concepto de la forma como hice el codigo. Un saludo. No esperaba que entiendas el código y menos el algoritmo, pero no creí que pudieses confundir cosas tan distintas, ni modo, intentaré con las plastilinas. ******************************************************************* En tu código indicas que inserte un número, sea para saber si es par o primo ok? En cada iteración imprimirá si es primo o par, o si no es alguno de ellos ok? Si introduce 1000 cuantas líneas imprimirá en pantalla hasta llegar al número deseado. tu propia funcion independiente que funcionase como un bucle y una sentencia de control de flujo a la vez... Investiga que son las Sentencias de Control de Flujo en Java y te darás cuenta de la tontería que escribiste. Yo se perfectamente como funciona una sentencia de control de flujo y es totalmente valido usarlo dentro de un bucle for como lo idealize en mi codigo (aunque imprima numero pares/impares y no primos). Se nota perfectamente. Acerca del código: Citando la Frikipedia El conjunto de los números primos es un subconjunto propio de los números naturales que engloba a todos los elementos de este conjunto mayores que 1 que son divisibles únicamente por sí mismos y por la unidad.
Por ejemplo, el número 7 tiene sólo dos divisores que son el 1 y el mismo 7 por lo que 7 es número primo. Hasta aquí ok? Si tenemos 1, 2, 3,..., n para mostrar el ejemplo descartamos el 1 y el mismo número que sería n para hacer la comprobación con módulo "%" puesto que si existe algún número superior a 1 e inferior a n que sea divisor de n, entonces NO SERA PRIMO, por lo tanto es inútil recorrer todos los números hasta n si encontramos algún divisor antes. Y remarcar que es una tontería comprobar con módulo "%" si n es divisible entre n eso por el "<=". Expresado en java: if(num > 1) { cont = 0; for(int nu = 2; nu < num; nu++){ if(num % nu == 0) { System. out. print("NO ES PRIMO\n"); cont = 1; break; } } if (cont == 0) System. out. print("ES PRIMO\n"); }
Espero que hayas captado algo de lo dicho puesto que no sabría como explicarlo de forma más sencilla. 43H4FH44H45H4CH49H56H45H tu algoritmo no es muy bueno, ademas de que el break en muchos casos quiere decir que la condición de parada de tu bucle no es la correcta, otra cosa, te recomiendo usar Scanner en vez del InputStreamReader, yo propongo este algoritmo para comprobar si un numero es primo: public boolean esPrimo(int numero) { double raiz = Math. sqrt(numero ); for(int i = 2; i <= raiz; i++) { if/numero % i == 0) return false; } return true; }
Si a alguien le sirve, simplemente lo envias en un for y listo, guardas en un arreglo los que te devuelvan true. - if/numero % i == 0) en que planeta funciona semejante linea? - i <= raiz en que momento un entero puede ser igual a un double??? por ejemplo Math.sqrt(10); - Así que hay que crear un arreglo para guardar los true - Prueba tu algoritmo con 900 o similares y veras que buen funcionamiento tiene te recomiendo usar Scanner en vez del InputStreamReader - Excelente recomendación de alguien que no sabe ni como funciona su propio algoritmo - No voy a comentar matemáticas de primaria para hacerte ver lo ineficiente de tu algoritmo con ciertos tipos de números.
|
|
« Última modificación: 28 Noviembre 2008, 06:56 am por 43H4FH44H45H4CH49H56H45H »
|
En línea
|
-R IP :0100 -A 100 2826:0100 MOV AH,09 2826:0102 MOV DX,109 2826:0105 INT 21 2826:0105 MOV AH,08 2826:0105 INT 21 2826:0107 INT 20 2826:0109 DB 'MI NICK ES CODELIVE.$' 2826:0127 -R BX :0000 -R CX :20 -N CODELIVE.COM -W
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
-Ramdc- te doy mucha razon en el uso del break en un bucle eso es una mera violacion de un lenguaje limpio estructurado. Pero conversando con Mister Perfecto en logica y analitica no creo que llevemos mucha ventaja o si Si introduce 1000 cuantas líneas imprimirá en pantalla hasta llegar al número deseado. Lo mas logico al hacer un programa de uso para otra persona es hacer los tipos de inserciones dinamicas, ya sean para vectores, arreglos o variables. Si ponemos datos meramente estaticos, para que servira tu aplicacion??? imaginate una calculadora donde este solamente predestinada a sumar 2+2 de que te sirve a ti o a otro??? Sinceramente, si te basas en que un codigo esta mal, sencillamente por aplicar la tecnica de valores dinamicos, asumo que tu no programas ninguna aplicacion para uso particular de nadie, ya que el 90% de aplicaciones teoricamente aplican el uso de valores dinamicos sino son inusables. Y si para ti es una limitante que yo no haya colocado un numero maximo de insercion, eso no es mala logica analitica porque para datos grandes por eso se desarrollo y existe el tipo de datos para guardar una cantidad de numero infinitos.. entonces si mi teoria segun tu esta erronea, los desarrolladores que crearon el tipo de datos a guardar en una variable tambien. Esto amigo, no es un error, cualquier programador novato si considera puede hacer una variable de valor dinamico y limitar hasta que numero maximo (En el caso del programa expuesto) tiene x usuario capacidad de realizar una insercion. Por ende, vuelvo y te repito... Habla menos y aporta mas
|
|
|
En línea
|
|
|
|
-Ramc-
Desconectado
Mensajes: 495
|
43H4FH44H45H4CH49H56H45H me quieres decir que solo existen raices decimales, creo que las matematicas te hacen falta a vos, claro que un entero puede ser mayor o igual a un flotante. public boolean esPrimo(int numero) { double raiz = Math. sqrt(numero ); for(int i = 2; i <= raiz; i++) { if(numero % i == 0) return false; } return true; }
Mi metodo funciona y es tan fácil como que si quiero los primeros 900 numeros primos, me los dara: public class Primos { public static boolean esPrimo(int numero) { double raiz = Math. sqrt(numero ); for(int i = 2; i <= raiz; i++) { if(numero % i == 0) return false; } return true; } public static void main (String[] args ) { int i = 2; int num = 0; while(num < 900) { if(esPrimo(i)) { num++; } i++; } } }
Adivina, ese code que esta arriba, lista los primeros 900 numeros primos, que tu PC no de para mas de 900 es otra cosa y si queres comprobarlos con tu calculadora de bolsillo señor matematico, por mi no hay problema. Si piensas probarlo, por si las dudas, guardalo como Primos.java Tu código hace lo mismo que el mio, el mio es mas corto, no hay problema, pero, que digas que no sirva sin haberlo probado es otra cosa, ¿eres siempre así de hostil o estas de malas? ^TiFa^ obviamente tenemos a alguien a quien no le funciono el netbeans y si el ide no lo compila estara malo?
|
|
« Última modificación: 29 Noviembre 2008, 00:34 am por -Ramc- »
|
En línea
|
Shhh... be vewy, vewy, quiet! I'm hunting wabbits...LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.
|
|
|
Hearts
Desconectado
Mensajes: 182
|
Con esto te basta: public static boolean buscaPrimo(long n){ if (n<=0) int i=2; boolean primo=true; while (i<=n/2 && primo){ if (n%i==0) primo=false; i=i+1; } return primo; }
PD:perdon por no tabularlo... salu2
|
|
|
En línea
|
|
|
|
43H4FH44H45H4CH49H56H45H
Wiki
Desconectado
Mensajes: 502
|
^TiFa^ si no entiendes, no entiendes no tiene caso insistir... -Ramc- Lee bien, un entero no puede ser igual a un double (con decimales), la comparación de igualdad solo te sirve cuando sacas la raiz a un numero como 25, lo mejor seria hacer una conversion o un redondeo antes de la comparación. Criticas el uso de break, pero que uso le das al return en tu bucle? Solo con for e if: for(i = 2; num % i != 0 && i < (num-1); i++){}; if(num % i != 0 || num ==2) System. out. print(num + "es primo \n");
Usandolo: public static void main (String[] args ) { int i; for(int num=2; num <= 1000; num++) { for(i = 2; num % i != 0 && i < (num-1); i++){}; if(num % i != 0 || num ==2) System. out. print(num + "es primo \n"); } }
Haber que tal funciona.
|
|
|
En línea
|
-R IP :0100 -A 100 2826:0100 MOV AH,09 2826:0102 MOV DX,109 2826:0105 INT 21 2826:0105 MOV AH,08 2826:0105 INT 21 2826:0107 INT 20 2826:0109 DB 'MI NICK ES CODELIVE.$' 2826:0127 -R BX :0000 -R CX :20 -N CODELIVE.COM -W
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
-Ramc- y yo nos hemos ido de fiesta Lo siento 43H4FH44H45H4CH49H56H45H no creo que queramos discutir... Al menos esa no es mi intencion, y tampoco se me ensena eso
|
|
|
En línea
|
|
|
|
-Ramc-
Desconectado
Mensajes: 495
|
Lee bien, un entero no puede ser igual a un double (con decimales), la comparación de igualdad solo te sirve cuando sacas la raiz a un numero como 25, lo mejor seria hacer una conversion o un redondeo antes de la comparación.
public class comp { public static void main (String[] args ) { int i = 5; double a = 5.0; boolean x = i == a; } }
Eso devuelve true, porque aunque sean tipos de datos distintos, el valor es el mismo, si le pongo 5.1 devuelve false así que mi comparación <= es correcta. Criticas el uso de break, pero que uso le das al return en tu bucle?
Yo retorno un valor que mi método debe devolver sino de que otra forma, pero, tu usas break y rompes con el curso de tu bloque y hasta donde yo se, no se puede por lo que uso return para devolver. -Ramc- y yo nos hemos ido de fiesta Lo siento 43H4FH44H45H4CH49H56H45H no creo que queramos discutir... Al menos esa no es mi intencion, y tampoco se me ensena eso Lo vez ^TiFa^ solo se ha dedicado a criticar sin tan siquiera probar los códigos y comprobar que lo que el dice es cierto. 43H4FH44H45H4CH49H56H45H como dice ^TiFa^ no queremos discutir, pero, estas atacandonos sin razón alguna, desde que comenzo el topic fuiste agresivo en tus post, cuando no tenias la razón.
|
|
|
En línea
|
Shhh... be vewy, vewy, quiet! I'm hunting wabbits...LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Un programador eficiente, siempre conoce la forma o via de obviar las sentencias debiles que producen inestabilidad al codigo tipo los break, goto, continue, etc....
Era entendible utilizar estas sentencias cuando existian ENIAC, BRLESC, Edvac y las tarjetas perforadas.. vamos, ahi era obligatorio, pero a estas alturas con estos modelos de PC y estos SO con capacidad de hacer variadas cosas a la vez, y estos lenguajes de alto nivel orientado a objetos como Java en este caso, que se supone que manejan y limpian la carga de memoria, las excepciones, y un sinumero de cosas.... creo que para un programador eficiente (Que es lo que tu quieres dejar notado aqui sobre tu persona 43H4FH44H45H4CH49H56H45H) EL uso de break es inadmisible...) No es valido para la optimizacion, ni lectura limpia del codigo fuente en si. Solo eso.
|
|
« Última modificación: 3 Diciembre 2008, 17:09 pm por ^TiFa^ »
|
En línea
|
|
|
|
|
|