elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: 1 ... 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [55] 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ... 235
541  Programación / Programación C/C++ / Re: Valor primo absoluto C++ en: 8 Noviembre 2018, 17:17 pm
Derterminar si un numero es Primo

Como se podria crear una lista con todos los primos absolutos desde 1 hasta un numero en cuestion?

Bienvenido al mundo de los numeros primos, la respuesta te la estas dando tu mismo.

Primero necesitas determinar los numero Primos que existen desde 2 hasta el numero en cuestion.

Una vez definida esa lista necesitas procesar los digitos de cada uno de esos numeros y detenerminar si suma es un numero primo hasta llegar a un solo digito.

Por lo cual tu primer problema es detenerminar si un numero es primo o no.

Metodos para lo mismo hay muchos, desde exhaustivos, probabilisticos.

Lo ideal para estar 100% seguro de que es primo o no, es ir contruyendo una lista de numeros primos, y probar todos los numero siguientes contra esa lista. Por ejemplo emepzamos con el 2, primer numero primo.

Luego 3, ¿es tres divisible entre 2? en otras palabras ¿ 3 modulo 2 es 0 ?  Si la respuesta a esta ultma es negativa podemos agregar 3 a nuestra lista de numeros primos.

Luego 4, ¿Es cuatro divisible entre 2? si 4 % 2 es 0, entonces 4 No es numero primo.

Luego 5 es cinco divisible entre 2, como 5%2 no es 0, y como 5 % 3 no es 0, entonces agregamos 5 a nuestra lista de numeros primos.

Asi sucedivamnete hasta el numero N, entonces ya con la lista definida de numeros primos, procedes a simplificar la suma de sus digiitos como mencionaste hasta llegar a un numero de un solo digito, con lo cual tienes tu problema resulto.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. unsigned int *primos = NULL;
  6. int n_primos = 0;
  7.  
  8. int agregar_numero(unsigned int numero);
  9. int es_primo(unsigned int numero);
  10. int es_primo_absoluto(unsigned int numero);
  11.  
  12. int main() {
  13. unsigned int i,j;
  14. unsigned int N = 0xFFFFFF;
  15. agregar_numero(2);
  16. printf("El numero %i es primo y ademas es Primo Absoluto\n",2);
  17. i = 3;
  18. while(i < N) {
  19. j = 0;
  20. if(es_primo(i)) {
  21. printf("El numero %i es primo\n",i);
  22. agregar_numero(i);
  23. if(es_primo_absoluto(i)){
  24. printf("El numero %i es primo y ademas es Primo Absoluto\n",i);
  25. }
  26. }
  27. i+=2; //Vamos de 2 en 2 por que no necesitamos evaluar los numeros pares, es decir solo 3, 5, 7, 9 .... Asi evistamos llamdas inecesarias a la funcion es_primo, haciendo nuestro programa un tanto mas eficiente
  28. }
  29. return 0;
  30. }
  31.  
  32. int agregar_numero(unsigned int numero) {
  33. primos = realloc(primos,sizeof(int) * (n_primos+1));
  34. primos[n_primos] = numero;
  35. n_primos++;
  36. }
  37.  
  38. int es_primo(unsigned int numero) { //Esta funcion solo determina correctamente si es primo o no, cuando ya hemos EVALUADO todos los numeros PREVIOS a este numero
  39. int es_primo = 1;
  40. int j = 0;
  41. while(j < n_primos && primos[j] < (numero/2) && es_primo) {
  42. es_primo = (numero % primos[j++] == 0) ? 0 : 1 ;
  43. }
  44. return es_primo;
  45. }
  46.  
  47. int es_primo_absoluto(unsigned int numero) {
  48. int retornar;
  49. char temporal[20] = {0};
  50. unsigned suma = 0;
  51. int len,i;
  52. sprintf(temporal,"%u",numero);
  53. len = strlen(temporal);
  54. if(len == 1) {
  55. switch(numero) {
  56. case 2:
  57. case 3:
  58. case 5:
  59. case 7:
  60. retornar = 1;
  61. break;
  62. default:
  63. retornar = 0;
  64. break;
  65. }
  66. }
  67. else {
  68. i = 0;
  69. while(i < len) {
  70. suma = temporal[i++] - '0';
  71. }
  72. if(es_primo(suma)) {
  73. retornar = es_primo_absoluto(suma);
  74. }
  75. else {
  76. retornar = 0;
  77. }
  78. }
  79. return retornar;
  80. }
  81.  

Saludos

542  Programación / Programación C/C++ / Re: matriz de adyacencia en: 8 Noviembre 2018, 05:08 am
'n' es  el dato ya que esta declarado como un solo char.
543  Programación / Programación C/C++ / Re: Grafos en: 8 Noviembre 2018, 04:56 am
Los grafos como tal son bastante enredados, y mas si todavia tienes dudas de estructuras mas basicas como listas ligadas, doblemente ligadas, circulares, y demás.

Pero si entiendes los grafos avanzaras mucho en tu entendimiento del la programación en cualquier lenguaje.

básicamente se utiliza la lista ligada para mantener un control sobre el numero total de nodos creados, pero no indica que la estructura de Lista ligada necesariamente tenga que ser parte de grafo.

saludos
544  Programación / Programación C/C++ / Re: Guardar una linea de enteros separados por un espacio en C en: 8 Noviembre 2018, 04:52 am
Excelente!  ;-)

Ahhhh!, arreglo de Enteros. si convertirlos mediante atoi esta bien. Suponiendo que siempre sea un numero valido. La otra funcion mas rubusta es strtol().

Saludos
545  Programación / Programación C/C++ / Re: Guardar una linea de enteros separados por un espacio en C en: 7 Noviembre 2018, 22:28 pm
Pues técnicamente el "arreglo" es un Arrglo,

Es un arreglo de apuntadores que apuntan valga la redundancia a donde estan guardados los valores leídos

Si ves en las lineas

Código:
		arreglo[i] = calloc(len+1,sizeof(char));
memcpy(arreglo[i],token,len);
printf("Numero %i: %s\n",i+1,arreglo[i]);

Siempre se hace referencia a arreglo.



Tal vez lo que necesitas es un arreglo Fijo, pero al no conocer que te van a dar como N , no podras por metodos de arreglos fijos prevenir correctamente el valor de N

char arreglo[N][30];

Supongamos un N = 1000


Ejemplo:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int main() {
  6. int  N,i = 0,len;
  7. char *buffer;
  8. char *token = NULL;
  9. char temporal[5000];
  10. fgets(temporal,1000,stdin);
  11. N = strtol(temporal,NULL,10);
  12. char arreglo[N][30];
  13. token = strtok(buffer," ");
  14. fgets(temporal,5000,stdin);
  15. token = strtok(temporal," ");
  16. do {
  17. //arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros
  18. len = strlen(token);
  19. memcpy(arreglo[i],token,len);
  20. printf("Numero %i: %s\n",i+1,arreglo[i]);
  21. token = strtok(NULL," ");
  22. i++;
  23. }while(i < N && token != NULL);
  24. }

Salida para N = 10

Código:
C:\codigos>ts1.exe
10
1 2 3 4 5 6 7 8 9 0
Numero 1: 1
Numero 2: 2
Numero 3: 3
Numero 4: 4
Numero 5: 5·a
Numero 6: 6
Numero 7: 7fúw~
Numero 8: 8
Numero 9: 9ÖÖ
Numero 10: 0


Salida para N=1000

Código:
Numero 961: 1
Numero 962: 2w╕τa
Numero 963: 3æ╝w Φa
Numero 964: 4
Numero 965: 5τa
Numero 966: 6w
Numero 967: 7@8
Numero 968: 8⌠
Numero 969: 9
Numero 970: 0µ
Numero 971: 1
Numero 972: 2
Numero 973: 3
Numero 974: 4
Numero 975: 5Θa
Numero 976: 6
Numero 977: 7
Numero 978: 8
Numero 979: 9ó╛wƱOuÉ
Numero 980: 0
Numero 981: 1
Numero 982: 2
Numero 983: 3
Numero 984: 4
Numero 985: 5
Numero 986: 6
Numero 987: 7
Numero 988: 8
Numero 989: 9Ωa
Numero 990: 0
Numero 991: 1Ωa
Numero 992: 2w
Numero 993: 3Ēw
Numero 994: 4
Numero 995: 5╝íw
Numero 996: 6
Numero 997: 7
Numero 998: 8
Numero 999: 9
Numero 1000: 0


Le memoria se podria limpiar con

char arreglo[N][30] = {0};

pero se me hace ineficiente hacerlo de esta forma.

Saludos
546  Foros Generales / Noticias / Re: Cómo saber los torrents que descarga alguien a través de su dirección IP en: 7 Noviembre 2018, 22:16 pm
 :¬¬

Técnicamente la pagina también a descargo torrents por lo menos la metadata de los mismos para poder realizar las consultas pertinentes a la red de torrent (Los trackers) y poder recopilar la información ahi existente, Es un golpe a la privacidad de ciertas IP, pero por lo menos la mayoría de las IPs son dinámicas.

Solo falta que se empiece a usar esa información para encarcelar personas. :silbar:

Saludos
547  Foros Generales / Dudas Generales / Re: ¿Es La Iniciativa Q El Nuevo Bitcoin O Solo Una Gran Estafa? en: 7 Noviembre 2018, 17:29 pm
Muy buen dia, la mayoria de los sistemas de pagos de este estilo, que utilizan su propia moneda mantienen su valor en bas que?, supuestamente la "fe" de la gente en que sus "Activos" mantienen el valor.

Características Genéricas del Dinero

Aceptación.- Que sea un bien aceptado por TODOS.
Poder adquisitivo.- Adquirir la máxima cantidad de bienes, capacidad de compra
Estabilidad.- Que consiste en su poca fluctuación u oscilación de su valor
Divisibilidad.- Que tenga buena cantidad de múltiplos y submúltiplos especialmente éstos denominados dinero fraccionario
Homogeneidad.- Que reúna características uniformes de peso, tamaño, color, inscripciones etc, que eviten su confusión y falsificación
Durabilidad.- Para que no se deteriore pronto con el uso, por eso se emplean metales duros que resisten mejor a la acción del tiempo o del uso y si es de papel deberá elegirse uno de calidad especial
De fácil transporte.- De pequeña dimensión y poco peso, que permite llevarla en el bolsillo

Actualmente y al igual que todo el dinero Fiduciario mantienen valor por que hay un gobierno que lo "Respalda" a excepcion de venezuela donde el gobierno no puede mantener el valor de su propia moneda y recurre a sistemas Fancy-shit como las criptodivisas, que de cripto no tiene nada, lo unico destacable es que medienta el sistema de block-chain mantienen una base de datos inquebrantable de cuanto dinero existe.

Si bien es cierto que el dinero "electrónico" es de facil transporte y es divisible, realmente le falta la aceptación de todos, ademas en la mayoria de los casos su valor esta Indefinido y sujeto a EXCLUSIVAMENTE a la ESPECULACIÓN.

Por ejemplo yo acepto Transferencias Bancarias, Paypal, Bitcoin etc mientras lo pueda mover para comprar cosas o pogar con el, no tengo problema con aceptarlo, sin embargo nadie me a pagado con Bitcoin, Solo me han pagado devez en cuando con Paypal y esto solo por que no esta la persona en el mismo pais que yo, si no optaría por una transferencia bancaria y/o deposito directo a cuenta.

El principal problema es que la gente comun y que  no es tan apegada a la tecnologia, no acepta con facilidad el dinero electronico, Por ejemplo aqui en mexico 2/3 de la poblacion NO ESTA BANCARIZADA, le tienen miedo a que el Fisco les cobre impuestos, y de hecho hasta un 95% de la economia esta basada en dinero en FISICO. por lo cual veo muy dificil que se llegue a aceptar de forma General una Moneda virtual.

Saludos

548  Programación / Programación C/C++ / Re: Grafos en: 7 Noviembre 2018, 17:12 pm
Una imagen vale mas que mil palabras:
https://www.youtube.com/watch?v=X5hR5iLWBeU

Que pasa MAFUS.

Yo crei que si el usuario estaba preguntando por grafos, ya conocía el concepto de listas enlazadas.

Volviendo a mi ejemplo hice la siguiente generacion de nodos creados aleatoriamente, y al final el programa llego a utilizar 53 MB de memoria.

Código
  1. int main() {
  2. int i,j;
  3. Grafo grafo,temp;
  4. srand(time(NULL));
  5. grafo  = crear_nodo(rand());
  6. i = 0;
  7. while(i < 1000000) {
  8. agregar_nodo(grafo,crear_nodo(rand()));
  9. i++;
  10. }
  11.  
  12. i = 0;
  13. while(i < 1000) {
  14. temp = grafo->nodos[rand() % grafo->n_nodos];
  15. j = 0;
  16. while(j < 200) {
  17. agregar_nodo(temp,crear_nodo(rand()));
  18. j++;
  19. }
  20. i++;
  21. }
  22. getc(stdin);// Solo para que no se cierre el programa pero no me gusta usar getc
  23. return 0;
  24. }
  25.  


Entonces si quisieramos elimintar todos los Nodos de forma Rapida para liberar la memoria,
¿Cual seria la forma mas facil de eliminarlos?

Respuesta:  ir guardando los nodos en una lista para posteriormente poder recorrerlos facilmente.

Saludos!
549  Programación / Programación C/C++ / Re: Grafos en: 7 Noviembre 2018, 16:50 pm
Realmente es una forma muy conveniente de tener una lista de todos los nodos de forma accesible

Imaginemos el siguiente problema

Digamos que te dejan crear un Grafo con un 10 Millones de Nodos, imagina tu que haces todo perfectamente, los enlaces entre nodos, los pesos de las aristas etc...

En ese mismo problema te indican que  tienes que hacer limpieza de X cantidad de Nodos ya sea algunos cuantos o todos.
Supongamos que es el mejor de los casos y que te piden borrar el grafo, para crear uno nuevo.

Lo mas facil seria crear un nuevo grafo y olvidarnos del anterior verdad?

pero son 10 Millones de nodos que siguen en la memoria  :rolleyes: :rolleyes:

Lo logico es borrar todos los nodos y liberar la memoria que se utilizo en el momento.

¿Como lo harias sin tener una lista de todos los nodos?

En caso de no tener una lista con todos los nodos, lo mas seguro es que tengas que recorrer el grafo nodo por nodo creando una lista de los nodos que ya liberastes y los que te faltan por liberar, lo cual podria llegar a ser un poco ineficiente.

Entonces mejor tener una lista que puedas recorrer de forma facil y sencilla para ir eliminándolos de uno por uno.


Veamos el siguiente codigo con una aproximaacion a generar un grado de forma muy sencilla.

Siendo el "Grafo" realmente un simple apuntador a un nodo, y cada nodo puede apuntar a mas nodos.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. typedef struct str_nodo *Nodo;
  5.  
  6. typedef struct str_nodo {
  7. int valor;
  8. Nodo *nodos; //Nodos con los que esta unido el nodo actual
  9. int n_nodos;
  10. }*Grafo;
  11.  
  12. Nodo crear_nodo(int valor);
  13. void agregar_nodo(Nodo inicial,Nodo final); //Esta funcion une ambos nodos
  14.  
  15. int main() {
  16. Grafo grafo;
  17. grafo  = crear_nodo(10);
  18. agregar_nodo(grafo,crear_nodo(5)); //Aqui tenemos el nodo 10 <-> 5 Que apunta al nodo 5
  19. agregar_nodo(grafo,crear_nodo(15));
  20. agregar_nodo(grafo,crear_nodo(800));
  21. agregar_nodo(grafo,crear_nodo(100));
  22. //En este punto parece sencillo recorrer todos los nodos existentens, pero las cosas se podrian complicar un poco si agregamos nodos a los nodos ya existententes de forma aleatoria
  23. return 0;
  24. }
  25.  
  26. Nodo crear_nodo(int valor) {
  27. Nodo nodo;
  28. nodo = calloc(1,sizeof(struct str_nodo));
  29. nodo->valor = valor;
  30. nodo->nodos = NULL;
  31. nodo->n_nodos = 0;
  32. return nodo;
  33. }
  34.  
  35. void agregar_nodo(Nodo inicial,Nodo final) {
  36. inicial->nodos = realloc(inicial->nodos,(inicial->n_nodos +1 )*sizeof(struct str_nodo*)); //Incrementamos el espacio para (inicial->n_nodos +1) Apuntadores
  37. final->nodos = realloc(final->nodos,(final->n_nodos +1 )*sizeof(struct str_nodo*)); //Incrementamos el espacio para (final->n_nodos +1) Apuntadores
  38.  
  39. inicial->nodos[inicial->n_nodos] = final;
  40. final->nodos[final->n_nodos] = inicial;
  41.  
  42. printf("%i <-> %i\n",inicial->valor,final->valor);
  43. inicial->n_nodos++;
  44. final->n_nodos++;
  45. }
550  Programación / Programación C/C++ / Re: Grafos en: 7 Noviembre 2018, 02:13 am
Tiene que ser necesariamente con lista enlazada?

Saludos
Páginas: 1 ... 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [55] 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ... 235
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines