Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jorgito19998 en 20 Febrero 2018, 21:39 pm



Título: Necesito ayuda con un programa en c
Publicado por: jorgito19998 en 20 Febrero 2018, 21:39 pm
Tengo que hacer un programa en c que imprima el triángulo de pascal pero no se como hacerlo. Lo he hecho con funciones pero me han dicho que lo más fácil es sin funciones y con matrices. Que alguien me pase el código con esas características, lo agradecería muchísimo. Este es el triángulo de Pascal: https://es.wikipedia.org/wiki/Tri%C3%A1ngulo_de_Pascal

-Esto es lo que he hecho:

Código
  1. #include <stdio.h>
  2.  
  3. int factorial(int n)
  4. {
  5.    if(n<2)
  6.        return 1;
  7.    else
  8.        return n * factorial(n-1);
  9. }
  10.  
  11. int combinacion(int n, int r)
  12. {
  13.    if(r==1)
  14.        return n;
  15.    else
  16.    {
  17.        if(n==r)
  18.            return 1;
  19.        else
  20.            return factorial(n) / (factorial(r) * factorial(n - r));
  21.    }
  22. }
  23.  
  24. int main()
  25. {
  26.    for(int i=0; i<=6; i++)
  27.    {
  28.        for(int ii=0; ii<=i; ii++){
  29.            printf("%d  ", combinacion(i, ii));
  30. }
  31. int x=1;
  32. int y=1;
  33. if (x==y){
  34.          printf("\n");
  35.        y=y+2;
  36.        x=1;
  37. } else x++;
  38.    }
  39.  
  40.    return 0;
  41. }


· Los códigos deben ir en etiquetas GeSHi
-Engel Lex


Título: Re: Necesito ayuda con un programa en c (Triangulo de pascal)
Publicado por: dijsktra en 23 Febrero 2018, 23:41 pm
Primero va una muestra del cálculo del trangulo de Pascal de base N=10

Código:
10

Código:
    1     1     1     1     1     1     1     1     1     1 
    1     2     3     4     5     6     7     8     9
    1     3     6    10    15    21    28    36
    1     4    10    20    35    56    84
    1     5    15    35    70   126
    1     6    21    56   126
    1     7    28    84
    1     8    36
    1     9
    1

Y ahora uno de N=20. Quizás puedas no apreciarla dependiendo de la distorsión que pueda ocasionar la resolución de carcateres.

Código:
20
Código:
    1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1 
    1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19
    1     3     6    10    15    21    28    36    45    55    66    78    91   105   120   136   153   171
    1     4    10    20    35    56    84   120   165   220   286   364   455   560   680   816   969
    1     5    15    35    70   126   210   330   495   715  1001  1365  1820  2380  3060  3876
    1     6    21    56   126   252   462   792  1287  2002  3003  4368  6188  8568 11628
    1     7    28    84   210   462   924  1716  3003  5005  8008 12376 18564 27132
    1     8    36   120   330   792  1716  3432  6435 11440 19448 31824 50388
    1     9    45   165   495  1287  3003  6435 12870 24310 43758 75582
    1    10    55   220   715  2002  5005 11440 24310 48620 92378
    1    11    66   286  1001  3003  8008 19448 43758 92378
    1    12    78   364  1365  4368 12376 31824 75582
    1    13    91   455  1820  6188 18564 50388
    1    14   105   560  2380  8568 27132
    1    15   120   680  3060 11628
    1    16   136   816  3876
    1    17   153   969
    1    18   171
    1    19
    1

Puedes computar tritangulos de base hasta N=30, pero a no ser que tengas una resolucion suficiente en el terminal de caracteres por pantalla, las figuras saldran sin formatear, y el efecto del trangulo se puede perder... Cuidado también con N altos porque los enteros se pueden salir de rango y acabar en negativos... usar unsigned long....


Y este es el código que lo resuelve... Ah!, empecé a hacerlo en C++, pero con pocos cambios puedes pasarlo a C.

Código
  1. #include <iostream>  // cin, cout
  2. #include <iomanip>  // setw
  3.  
  4. using namespace std;
  5.  
  6. #define MAX 1000
  7.  
  8. // P : N > 0
  9. // Q : \forall ii,jj : 0 <= ii,jj < N : M[ii][jj]=C(ii+1,jj+1)
  10. // I : i > 0 -> \forall jj : 0 <= jj < N : M[i-1][jj]=C(i-1,jj)
  11.  
  12. // Inner loop
  13. // I2 : \forall jj : 0 <= jj < j : M[i][jj]=C(i+1,jj+1)
  14. // and
  15. // acum = i>0 -> acum= \sum k:0<=k<j: M(i-1,k)
  16.  
  17. // where C(i,j) is combinatory number
  18. //  C(1,j) = 1
  19. //  C(i+1,j) = \sum k:1<=k<=j: C(i,k)
  20.  
  21. void pascal(int M[][MAX], const int N)
  22. {
  23.  int acum;
  24.  int i,j;
  25.  for ( i=0; i<N ; i++)
  26.    for ( j=acum=0; j< N-i ; j++)
  27.      if (i==0)
  28. M[i][j]= 1;
  29.      else
  30. {
  31.  acum += M[i-1][j];
  32.  M[i][j] = acum;
  33. }
  34.  return;
  35. }
  36.  
  37. int main(int argc, char **args)
  38. {
  39.  int N;
  40.  int M[MAX][MAX];
  41.  cin >> N ;
  42.  pascal(M,N);
  43.  for (int i=0; i < N ; i++)
  44.    {
  45.      for (int j=0; j < N-i ; j++)
  46. cout << setw(5) << M[i][j] << " " ;
  47.      cout << endl;
  48.    }
  49.  return 0;
  50. }