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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 24
61  Programación / Programación C/C++ / Re: Alternativa a pow? [c] en: 10 Diciembre 2010, 15:07 pm
Hola, como sabran o se imaginaran, soy adicionado a la informatica, y en el libro todavia no he visto la función pow, asi que me preguntaba si  "num ^ exp" seria  valido para calcular la potencia de algun numero. saludoss
Ese operador es la XOR bit a bit. No hay un operador para calcular potencias en C, tienes que usar la función pow como ya te han dicho o hacerte una tú mismo.

Te dejo un código que calcula potencias usando Divide&Conquer con una complejidad de O(logn) (los que te han puesto son O(n)). Esto es útil sobretodo cuando se quieren calcular potencias muy grandes módulo un cierto número.

Código
  1. #include <stdio.h>
  2.  
  3. int eleva(int base, int exp) {
  4.    if (exp == 0) return 1;
  5.    int res = eleva(base, exp/2);
  6.    res *= res;
  7.    if (exp%2 == 1) res *= base;
  8.    return res;
  9. }
  10.  
  11. int main() {
  12.    int base, exp;
  13.    scanf("%d %d", &base, &exp);
  14.    printf("%d\n", eleva(base, exp));
  15. }
62  Programación / Programación C/C++ / Re: Comparando resultados[c] en: 9 Diciembre 2010, 15:19 pm
Sería mucho más eficiente si en lugar de iterar sobre los números, iteraras sobre el factor del 5, así pasarías directamente por los múltiplos.

Además, matemáticamente puedes resolverlo sin bucles. Pongo un programa que recoge en primer lugar el valor (en tu caso el 5) y a continuación el número de múltiplos que se quiera sumar e imprime su suma.
Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.    int valor, n;
  5.    scanf("%d %d", &valor, &n);
  6.    printf("%d\n", valor*n*(n + 1)/2);
  7. }
63  Programación / Programación C/C++ / Re: problema de la mochila en c!! en: 8 Diciembre 2010, 17:43 pm
Del problema de la mochila hay muchas variaciones y según entiendo de lo que dices, tú estás buscando resolver lo que se conoce como Fractional Knapsack Problem, mientras que el código que has puesto a simple vista parece que hace una DP para resolver el problema de la mochila estándar, donde los objetos no se pueden fraccionar (o se meten o no se meten).

En tu caso, el problema del Fractional Knapsack Problem, es mucho más simple y no requiere programación dinámica. Lo puedes resolver con un greedy muy tonto, ordenando lo objetos según beneficio/tamaño e ir cogiendo en orden los que tengan mayor cociente hasta llenar la mochila.
64  Programación / Programación C/C++ / Re: problema con caballo de ajedrez!!! en: 8 Diciembre 2010, 17:32 pm
http://es.wikipedia.org/wiki/B%C3%BAsqueda_en_anchura

Ahí lo tienes bastante bien explicado. Es un algoritmo de búsqueda en grafos. Para grafos cuyas aristas tengan todas el mismo coste, se puede usar para encontrar distancias mínimas de un nodo al resto.
65  Programación / Programación C/C++ / Re: problema con caballo de ajedrez!!! en: 8 Diciembre 2010, 17:23 pm
Aparte que mirándolo por encima, parece que ese código intenta resolver el problema del Knight's Tour, no lo que tú necesitas. Inténtalo hacer tú mismo usando BFS que es muy sencillo.
66  Programación / Programación C/C++ / Re: problema con caballo de ajedrez!!! en: 8 Diciembre 2010, 17:04 pm
O siquiera que busque antes de preguntar, puse un link a un codigo que habia visto aquí antes..! y aun así dice que no vale  :rolleyes:
De todas maneras, el código que has puesto no hace lo que él necesita, simplemente muestra a donde puede ir el caballo dada una posición inicial. Además, ya puestos, ese código es horrible xDD.
67  Programación / Programación C/C++ / Re: problema con caballo de ajedrez!!! en: 8 Diciembre 2010, 16:57 pm
Vaya chanchullos...

¿Desde cuándo va así este foro, que para recibir ayuda tienes que darla primero?

Para el problema del caballo, lo puedes resolver usando BFS (Búsqueda en anchura) y empezando en la casilla inicial. Si vas guardando el coste mínimo para llegar a cada casilla, obtendrás en concreto el que tú buscas. Hay una manera un poco más eficiente de hacerlo, pero es un poco más complicada y tampoco te quiero liar si no sabes hacerlo de la forma estándar. Intenta hacerlo y te vamos ayudando, lo que no vamos a hacer es darte el código, que programándolo bien se puede hacer en unas 30 línias así a ojo.
68  Programación / Java / Re: [RETO ABIERTO] Cambio de base ~ en: 2 Diciembre 2010, 17:00 pm
El primero puede hacerse bastante más corto haciéndolo recursivamente. No lo probado, pero deberían funcionar las dos funciones.
Código
  1. public class conversor {
  2.    public static String decimalBase(long x, int base) {
  3.        String res;
  4.        if (x%base <= 9) res = new String(String.valueOf((char)(x%base + '0')));
  5.        else res = new String(String.valueOf((char)(x%base - 10 + 'A')));
  6.        if (x/base > 0) res = decimalBase(x/base, base).concat(res);
  7.        return res;
  8.    }
  9.  
  10.    public static long baseDecimal(String numero, long base) {
  11.        long res = 0;
  12.        for (int i = 0; i < numero.length(); ++i)
  13.            res = res*base + (long)Character.getNumericValue(numero.charAt(i));
  14.        return res;
  15.    }
  16. }

Siento si hay algo del código que no sea necesario, como por ejemplo castings. Java no es el lenguaje que uso habitualmente.

EDITO:
No había visto lo de en cualquier lenguaje. Pongo la primera función en C++ de una forma más compacta.
Código
  1. typedef long long ll;
  2.  
  3. string dtoB(ll x, int b) {
  4.    return ((x/b > 0)?dtoB(x/b, b):"") + char(x%b + (x%b < 10)*'0' + (x%b >= 10)*('A' - 10));
  5. }
69  Programación / .NET (C#, VB.NET, ASP) / Re: [Reto] Backtracking - Laberinto en: 24 Noviembre 2010, 18:57 pm
El enunciado tiene muchas imprecisiones. Cuando dice la primera solución, entiendo que se refiere a la primera que encuentre el backtracking, pero no queda claro ni especifica qué criterio usar.

Lo segundo que pide es, bajo mi punto de vista, erróneo. Con el enunciado actual no se prohíben los ciclos, de forma que existen infinitos caminos para la gran mayoría de laberintos. Se tendría que especificar una longitud máxima o bien exigir que no haya ciclos.

Lo tercero es correcto, pero en lugar de un backtracking puede resolverse mediante Dijkstra, cuya complejidad para un grafo G = (V, E) es O((V + E)logV) mientras que el backtracking no es polinómico.

He picado Dijkstra  en C++ para el problema, he probado un par de ejemplos y los resuelve bien. El código es simple así que no debería ser problema pasarlo a otro lenguaje sabiendo un poco de C++.
Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. const int INF = 1000000000;
  7. const int arr1[] = {1, -1, 0, 0};
  8. const int arr2[] = {0, 0, 1, -1};
  9.  
  10. typedef pair<int, int> PII;
  11. typedef pair<int, PII> PIPII;
  12.  
  13. void dijkstra(int fini, int cini, int ffin, int cfin, vector<vector<int> >& M) {
  14.    int n = M.size(), m = M[0].size();
  15.    vector<vector<int> > d(n, vector<int>(m, INF));
  16.    d[fini][cini] = 0;
  17.    priority_queue<PIPII> Q;
  18.    Q.push(PIPII(0, PII(fini, cini)));
  19.    while (not Q.empty()) {
  20.        int f = Q.top().second.first, c = Q.top().second.second, dist = -Q.top().first;
  21.        Q.pop();
  22.        if (dist != d[f][c]) continue;
  23.        for (int i = 0; i < 4; ++i) {
  24.            int nf = f + arr1[i], nc = c + arr2[i];
  25.            if (nc < 0 or nc >= m or nf < 0 or nf >= n or M[nf][nc] == 0) continue;
  26.            if (d[nf][nc] > d[f][c] + M[nf][nc]) {
  27.                d[nf][nc] = d[f][c] + M[nf][nc];
  28.                Q.push(PIPII(-d[nf][nc], PII(nf, nc)));
  29.            }
  30.        }
  31.    }
  32.    if (d[ffin][cfin] == INF) cout << "No existe camino" << endl;
  33.    else cout << "Minima distancia: " << d[ffin][cfin] << endl;
  34. }
  35.  
  36. int main() {
  37.    int n, m;
  38.    cin >> n >> m;
  39.    vector<vector<int> > M(n, vector<int> (m));
  40.    for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) cin >> M[i][j];
  41.    int fini, ffin, cini, cfin;
  42.    cin >> fini >> ffin >> cini >> cfin;
  43.    if (M[fini][cini] == 0) cout << "Muro en posicion inicial" << endl;
  44.    else dijkstra(fini, cini, ffin, cfin, M);
  45. }
70  Programación / Programación C/C++ / Re: No entiendo algoritmo de ordenamiento en: 2 Noviembre 2010, 16:06 pm
Es bastante simple, para cada numero mira si los siguientes son menores, en el caso de que lo sean, llama a la función que los cambia, es una manera eficiente de ordenar una lista. Por ahí te han dejado un link a la wikipedia que lo explica bastante bien.

No es una forma nada eficiente de ordenar el algoritmo de ordenación por selección. Lo que sucede es que es muy simple y por eso es de los primeros algoritmos que se enseñan. Este algoritmo tiene un coste de O(n2), mientras que otros algoritmos de ordenación como heap sort, merge sort o quicksort tienen costes O(nlogn) (quicksort en caso peor es cuadrático, pero en caso medio tiene esa complejidad). De los algoritmos cuadráticos típicos (selection sort, bubble sort e insertion sort), el único que sirve es insertion sort, porque aunque sea cuadrático en caso peor, generalmente es algo mejor y para entradas pequeñas es más rápido que los que he dicho antes.
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 24
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines