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


 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Ejercicios
| | | |-+  Retos C/C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 4 5 6 7 [8] 9 Ir Abajo Respuesta Imprimir
Autor Tema: Retos C/C++  (Leído 38,391 veces)
ace332

Desconectado Desconectado

Mensajes: 66


Ver Perfil
Re: Retos C/C++
« Respuesta #70 en: 13 Septiembre 2010, 19:32 »

disculpame compañero pero me parece que no leiste bien el enunciado del problema :o:

Citar
Calcular el factorial de un número n, 0<=n<=100

El programa que pusiste sólo calcula bien hasta el factorial de 12.

Saludos.

PD: Si gustan pongo la solución y pasamos al reto planteado por Og  :)


En línea

ghastlyX
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.900



Ver Perfil
Re: Retos C/C++
« Respuesta #71 en: 13 Septiembre 2010, 20:31 »

He reaprovechado un código que hice hace un tiempo que multiplica usando Karatsuba, por lo que el código es largo y feo. Si alguien lo prefiere dejo una versión nueva y más legible sin usar Karatsuba. De hecho, Karatsuba sólo se usa si los dos números a multiplicar son suficiente grandes (unos 100 dígitos) en mi código, pero lo dejo por si a alguien le interesa.
Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. typedef vector<long long> VL;
  7.  
  8. VL mult(VL& a, int i1, int f1, VL& b, int i2, int f2) {
  9.    if (i1 > f1 or i2 > f2) return VL(1,0);
  10.    if (f1 >= a.size()) return mult(a, i1, a.size() - 1, b, i2, f2);
  11.    if (f2 >= b.size()) return mult(a, i1, f1, b, i2, b.size() - 1);
  12.    if (i1 >= a.size() or i2 >= b.size()) return VL(1,0);
  13.    int n = f1 - i1 + 1, m = f2 - i2 + 1;
  14.    VL c(max(n,m)*2 + 1, 0);
  15.    for (int i = i1; i <= f1; ++i) {
  16.        for (int j = i2; j <= f2; ++j) {
  17.            c[i - i1 + j - i2] += (a[i]*b[j]);
  18.            c[i - i1 + j - i2 + 1] += (c[i - i1 + j - i2]/1000000000);
  19.            c[i - i1 + j - i2] %= 1000000000;
  20.        }
  21.    }
  22.    int pos = c.size() - 1;
  23.    while (pos > 0 and c[pos--] == 0) c.pop_back();
  24.    return c;
  25. }
  26.  
  27. VL suma(VL& a, int i1, int f1, VL& b, int i2, int f2) {
  28.    if (i1 > f1 or i1 >= a.size()) {
  29.        VL cero(1,0);
  30.        return suma(cero, 0, 0, b, i2, f2);
  31.    }
  32.    if (i2 > f2 or i2 >= b.size()) {
  33.        VL cero(1, 0);
  34.        return suma(a, i1, f1, cero, 0, 0);
  35.    }
  36.    if (f1 >= a.size()) return suma(a, i1, a.size() - 1, b, i2, f2);
  37.    if (f2 >= b.size()) return suma(a, i1, f1, b, i2, b.size() - 1);
  38.    int n = f1 - i1 + 1, m = f2 - i2 + 1;
  39.    VL c(n + m + 2, 0);
  40.    int i = i1, j = i2, k = 0;
  41.    while (i <= f1 and j <= f2) {
  42.        c[k] += (a[i] + b[j]);
  43.        c[k + 1] += (c[k]/1000000000);
  44.        c[k] %= 1000000000;
  45.        ++i; ++j; ++k;
  46.    }
  47.    while (i <= f1) {
  48.        c[k] += a[i];
  49.        c[k + 1] += (c[k]/1000000000);
  50.        c[k] %= 1000000000;
  51.        ++i; ++k;
  52.    }
  53.    while (j <= f2) {
  54.        c[k] += b[j];
  55.        c[k + 1] += (c[k]/1000000000);
  56.        c[k] %= 1000000000;
  57.        ++j; ++k;
  58.    }
  59.    int pos = c.size() - 1;
  60.    while (pos > 0 and c[pos--] == 0) c.pop_back();
  61.    return c;
  62. }
  63.  
  64. VL resta(VL& a, int i1, int f1, VL& b, int i2, int f2) {
  65.    VL c;
  66.    c = a;
  67.    for (int i = i2; i <= f2; ++i) {
  68.        c[i] -= b[i];
  69.        while (c[i] < 0) {
  70.            c[i] += 1000000000;
  71.            c[i + 1]--;
  72.        }
  73.    }
  74.    int pos = c.size() - 1;
  75.    while (pos > 0 and c[pos--] == 0) c.pop_back();
  76.    return c;
  77. }
  78.  
  79. VL karatsuba(VL& a, int i1, int f1, VL& b, int i2, int f2) {
  80.    if (i1 > f1 or i2 > f2) return VL(1,0);
  81.    if (f1 >= a.size()) return karatsuba(a, i1, a.size() - 1, b, i2, f2);
  82.    if (f2 >= b.size()) return karatsuba(a, i1, f1, b, i2, b.size() - 1);
  83.    if (i1 >= a.size() or i2 >= b.size()) return VL(1,0);
  84.    int p = f1 - i1 + 1, m = f2 - i2 + 1;
  85.    if (min(p, m) <= 10) return mult(a, i1, f1, b, i2, f2);
  86.    int n = max(p, m);
  87.    VL c1, c2, c3, x, y;
  88.    int mit = n/2;
  89.    c1 = karatsuba(a, i1 + mit, f1, b, i2 + mit, f2);
  90.    c3 = karatsuba(a, i1, i1 + mit - 1, b, i2, i2 + mit - 1);
  91.    x = suma(a, i1, i1 + mit - 1, a, i1 + mit, f1);
  92.    y = suma(b, i2, i2 + mit - 1, b, i2 + mit, f2);
  93.    c2 = karatsuba(x, 0, x.size() - 1, y, 0, y.size() - 1);
  94.    c2 = resta(c2, 0, c2.size() - 1, c1, 0, c1.size() - 1);
  95.    c2 = resta(c2, 0, c2.size() - 1, c3, 0, c3.size() - 1);
  96.    VL res(2*n + 3, 0);
  97.    for (int i = 0; i < c1.size(); ++i) {
  98.        res[i + 2*mit] += c1[i];
  99.        res[i + 2*mit + 1] += (res[i + 2*mit]/1000000000);
  100.        res[i + 2*mit] %= 1000000000;
  101.    }
  102.    for (int i = 0; i < c2.size(); ++i) {
  103.        res[i + mit] += c2[i];
  104.        res[i + mit + 1] += (res[i + mit]/1000000000);
  105.        res[i + mit] %= 1000000000;
  106.    }
  107.    for (int i = 0; i < c3.size(); ++i) {
  108.        res[i] += c3[i];
  109.        res[i + 1] += (res[i]/1000000000);
  110.        res[i] %= 1000000000;
  111.    }
  112.    int pos = res.size() - 1;
  113.    while (pos > 0 and res[pos--] == 0) res.pop_back();
  114.    return res;
  115. }
  116.  
  117. string str(long long x) {
  118.    string s;
  119.    do {
  120.        s += char(x%10 + '0');
  121.        x /= 10;
  122.    } while(x > 0);
  123.    reverse(s.begin(), s.end());
  124.    return s;
  125. }
  126.  
  127. int main() {
  128.    int n;
  129.    cin >> n;
  130.    VL res(1,1);
  131.    for (int i = 1; i <= n; ++i) {
  132.        VL a(1,i);
  133.        VL c;
  134.        c = karatsuba(a, 0, a.size() - 1, res, 0, res.size() - 1);
  135.        res = c;
  136.    }
  137.    cout << res[res.size() - 1];
  138.    for (int i = res.size() - 2; i >= 0; --i) {
  139.        string s = str(res[i]);
  140.        cout << string(9 - s.size(), '0') << s;
  141.    }
  142.    cout << endl;
  143. }
  144.  

Ahora pasemos al reto de Og. y a ver si alguien se anima, que es una dinámica sencillita.


En línea

ace332

Desconectado Desconectado

Mensajes: 66


Ver Perfil
Re: Retos C/C++
« Respuesta #72 en: 14 Septiembre 2010, 03:09 »

Solved  ::)

Código:

#include <stdio.h>
#include <string.h>

#define MAX_TAM_BASE 1000

#define max(a,b) (((a)>(b))?(a):(b))

int main(void)
{
  int N,i,j,maxmax=0,maximos[MAX_TAM_BASE];
 
  scanf("%d",&N);
  memset(maximos,0,sizeof(int)*MAX_TAM_BASE);
  for(i=0;i<N;i++)
  {
    int temp1=0,temp2,piedras;
    for(j=0;j<=i;j++)
    {
      temp2=maximos[j];
      scanf("%d",&piedras);
      maximos[j]=piedras+max(temp1,maximos[j]);
      temp1=temp2;
    }
  }

  for(j=0;j<N;j++)
  {
    if(maximos[j]>maxmax)
      maxmax=maximos[j];
  }
  printf("%d\n",maxmax);
  return 0;
}

Reto #20: Dado un año N (N>=1600), determinar qué día será (o fue) el primero de enero de ese año.

Por ejemplo para una entrada N = 2009, la respuesta seria 'Jueves'.
En línea

ace332

Desconectado Desconectado

Mensajes: 66


Ver Perfil
Re: Retos C/C++
« Respuesta #73 en: 19 Septiembre 2010, 20:19 »

Bueno parece que nadie se animo a resolver el reto por lo que aqui va la solución:

Código:
#include <stdio.h>
#include <stdlib.h>

#define anyo_ref  2010
#define diainicio Viernes

enum Dia{ Domingo, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado };
const char *strdia[]={"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };

int esbisiesto(int anyo);

int main(void)
{
  int a, anyo, ai=anyo_ref, af, ndias=0, dia1enero;

  scanf("%d",&anyo);

  af = anyo-1;
  if(anyo < anyo_ref)
  {
    ai = anyo;
    af = anyo_ref-1;
  }
  for(a = ai; a <= af; a++)
    ndias += esbisiesto(a)?2:1;

  dia1enero = (diainicio + ((anyo >= anyo_ref)?1:-1) * ndias) %7;
  if(dia1enero < 0)
    dia1enero += 7;

  printf("%s\n",strdia[dia1enero]);
  return 0;
}

int esbisiesto(int anyo)
{
  return (anyo%4) == 0 && ((anyo%100) != 0 || (anyo%400) == 0);
}
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Retos C/C++
« Respuesta #74 en: 27 Septiembre 2010, 00:09 »

Publica el proximo reto.
En línea

ace332

Desconectado Desconectado

Mensajes: 66


Ver Perfil
Re: Retos C/C++
« Respuesta #75 en: 27 Septiembre 2010, 02:37 »

Bueno.. aqui va uno un tanto sencillo.
Citar
Un número perfecto es un número natural que es igual a la suma de sus divisores propios positivos, sin incluirse él mismo. Dicho de otra forma, un número perfecto es aquel que es amigo de sí mismo.

Así, 6 es un número perfecto, porque sus divisores propios son 1, 2 y 3; y 6 = 1 + 2 + 3. Los siguientes números perfectos son 28, 496 y 8128.
fuente: Wikipedia.

Reto #21: Hacer un programa que imprima en pantalla todos los números perfectos hasta un número N dado como entrada.
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Retos C/C++
« Respuesta #76 en: 27 Septiembre 2010, 05:23 »

Código
  1. #include <iostream>
  2. int main()
  3. {
  4. int a,b;
  5. std::cin>>a;
  6. for(int i=1;i<=a;i++)
  7. {
  8. b=0;
  9. for(int j=1;j<i;j++)if(i%j==0)b+=j;
  10. if(b==i)std::cout<<b<<std::endl;
  11. }
  12. return 0;
  13. }
  14.  

PsData: En unas horas traigo reto... tengo un sueño que no me deja siquiera pensar.
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Retos C/C++
« Respuesta #77 en: 27 Septiembre 2010, 21:05 »

Reto #22: Dada dos fechas, verificar cuantos dias han transcurrido... se debe de tomar en cuenta los años bisiestos.
En línea

Wazzp

Desconectado Desconectado

Mensajes: 34


We have seen the fall of the elite...


Ver Perfil
Re: Retos C/C++
« Respuesta #78 en: 29 Septiembre 2010, 00:06 »

Disculpen mi impaciencia pero.. tengo un codigo,que a mi parecer esta bien,pero tiene un error ya que se cuelga y no hace nada.. alguien podria revisarlo? Si lo corrijo creo que solucionaria el reto # 22.. Respondan asi lo posteo,sino,borren este post y busco alguna otra forma de conseguir mi respuesta..

Gracias y Saludos  :)
En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.647


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Retos C/C++
« Respuesta #79 en: 29 Septiembre 2010, 03:24 »

Postealo a ver, lo vamos revisando y arreglando.

Saludos.
En línea

Páginas: 1 2 3 4 5 6 7 [8] 9 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Retos .Net « 1 2 3 »
Ejercicios
[D4N93R] 20 13,377 Último mensaje 6 Diciembre 2010, 03:26
por final_frontier
Concursos y retos
Programación General
lnvisible 0 1,248 Último mensaje 12 Diciembre 2010, 19:44
por lnvisible
cuando consigo nuevos retos? « 1 2 »
WarZone
Tyrz 11 3,735 Último mensaje 15 Junio 2011, 23:11
por [-Franko-]
Desarrollo de Retos Informaticos
Desarrollo Web
Sinedra 0 2,233 Último mensaje 23 Febrero 2011, 19:23
por Sinedra
Retos C/C++
Programación C/C++
N0body 5 8,814 Último mensaje 9 Mayo 2011, 09:54
por ghastlyX
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines