Advertisement
luisphelipe

sierpinski_relatorio

Apr 23rd, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.56 KB | None | 0 0
  1. 03.
  2. primeiramente tentei achar um padrão no triangulo de sierpinski, é facil de entender como funciona, mas não é facil
  3. implementar algo que replique esse padrão, nao com o que aprendemos ate agora. conversando com o Saulo, aprendi que
  4. podemos usar o binomio de newton, no triangulo de Newton se selecionarmos apenas os numeros impares, obtemos o triangulo de
  5. sierpinski. o problema com esse approach, é que para calcularmos o binomio de newton usamos fatorial, e um numero fatorial fica grande muito
  6. rapidamente. com ele conseguimos apenas o triangulo de ordem 3 antes que haja o overflow do integer, usando o long long int acredito que
  7. conseguimos o de ordem 4 e talvez o de 5. conseguindo implementar uma função diferenciada para calcular o binomio de newton calculando os
  8. fatoriais envolvidos ao mesmo tempo, e fazendo as divisoes assim que possivel, não deixando que a variavel cresca demais.
  9. porem mesmo com ela, o binomial fica grande demais, com isso, consegui chegar ao triangulo de ordem 6 quase completo. poderiamos continuar com
  10. essa ideia tentando achar uma forma de descobrir se o numero apos os calculos termina impar ou par(poderiamos ter pesqusiado se havia uma forma).
  11. no final usamos a solução do rosetta code, implementando nosso proprio conversor pra numero binario e comparação bitwise AND.
  12.  
  13. soluções:
  14.  
  15. 01.
  16. #include <stdio.h>
  17.  
  18. int fatorial(int valor);
  19. int b_newton(int n, int k);
  20.  
  21. int main(){
  22.     int n, pot;
  23.  
  24.     while(1){
  25.         printf("De um grau: ");
  26.         scanf("%d", &n);
  27.         pot = pow(2, n);
  28.  
  29.         for(int alt = pot; alt; alt--){
  30.             for(int esp = alt; esp; esp--) printf(" ");
  31.  
  32.             for(int k = 0; k <= pot-alt; k++){
  33.                 int bin = b_newton(pot-alt, k);
  34.  
  35.                 if(bin < 0) printf("x ");
  36.                 else if(bin%2) printf("* ");
  37.                 else printf("  ");
  38.             }
  39.  
  40.             printf("\n");
  41.         }
  42.     }
  43.     return 0;
  44. }
  45.  
  46. int fatorial(int valor){
  47.     int fat = 1;
  48.  
  49.     for(int i = 2; i <= valor; i++) fat *= i;
  50.  
  51.     return fat;
  52. }
  53.  
  54. int b_newton(int n, int k){
  55.     int binomio;
  56.  
  57.     binomio = fatorial(n)/(fatorial(k)*fatorial((n - k)));
  58.  
  59.     return binomio;
  60. }
  61. ---------------------------------------------------------------------------------------------------------------------------------------
  62. 02.
  63. #include <stdio.h>
  64.  
  65. void sierpinski(int ordem);
  66. long long int b_newton(int n, int k);
  67.  
  68. main()
  69. {
  70.     int a, pot;
  71.  
  72.     while(1){
  73.         scanf("%d", &a);
  74.  
  75.         pot = pow(2, a);
  76.         sierpinski(pot);
  77.     }
  78. }
  79.  
  80. void sierpinski(int ordem)
  81. {
  82.         for(int a = 0; a < ordem; a++){
  83.             printf("%17s", " ");
  84.         for(int esp = ordem; esp  >a; esp--) printf(" ");
  85.  
  86.         for(int b = 0; b <= a; b++){
  87.             long long int bin = b_newton(a, b);
  88.  
  89.             if(bin < 0) printf("x");
  90.             else if(bin%2) printf("*");
  91.             else printf(" ");
  92.  
  93.             printf(" ");
  94.         }
  95.         printf("\n");
  96.     }
  97. }
  98.  
  99. long long int b_newton(int n, int k){
  100.     long long int binomio = 1,
  101.         a, b, c, fator;
  102.  
  103.     a = 2, b = 2, c = 2;
  104.  
  105.     while(a <= n){
  106.  
  107.         binomio *= a;
  108.  
  109.         while(1){
  110.             if(binomio%b == 0 && b <= k){
  111.                 binomio /= b;
  112.                 b++;
  113.             }
  114.             else break;
  115.         }
  116.  
  117.         while(1){
  118.             if(binomio%c == 0 && c <= n-k){
  119.                 binomio /= c;
  120.                 c++;
  121.             }
  122.             else break;
  123.         }
  124.         a++;
  125.     }
  126.     return binomio;
  127. }
  128. ---------------------------------------------------------------------------------------------------------------------------------------
  129. 03(final).
  130. #include <stdio.h>
  131.  
  132. int binario(int decimal);
  133. int compara(int bin1, int bin2);
  134.  
  135. int main()
  136. {
  137.     int tamanho, y, x, i;
  138.  
  139.     printf("ORDEM: ");
  140.     scanf("%d", &tamanho);
  141.     tamanho = pow(2, tamanho);
  142.  
  143.     for (y = tamanho - 1; y >= 0; y--) {
  144.         for (i = 0; i < y; i++) printf(" ");
  145.  
  146.         for (x = 0; x + y < tamanho; x++){
  147.             if (compara(x, y)) printf("* ");
  148.             else printf("  ");
  149.  
  150.         }
  151.         printf("\n");
  152.     }
  153.     return 0;
  154. }
  155.  
  156. int binario(int decimal){
  157.     int binario = 0, aux = 1;
  158.  
  159.     while(decimal){
  160.         if (decimal%2)
  161.             binario += aux;
  162.         decimal /= 2;
  163.         aux *= 10;
  164.     }
  165.     return binario;
  166. }
  167.  
  168. int compara(int dec1, int dec2)
  169. {
  170.     int bin1, bin2;
  171.  
  172.     bin1 = binario(dec1);
  173.     bin2 = binario(dec2);
  174.  
  175.     while(bin1 || bin2){
  176.         if((bin1%2) && (bin2%2)) return 0;
  177.         bin1 /= 10, bin2 /= 10;
  178.     }
  179.     return 1;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement