quarta-feira, 14 de março de 2012

Feliz dia do pi 2

Uma maneira mais fácil de calcular o número pi seria contando quantos pontos caem dentro de um círculo inscrito em um quadrado.


Sugestão enviada por David Sena :)


Como a quantidade de pontos dentro de um quadrado é igual a cardinalidade dos reais. Podemos utilizar duas estratégias:

1) Desenvolver um algoritmo que escolhe pontos aleatórios dentro do quadrado e conta quantos pontos caem dentro do círculo com raio 1 com centro no ponto (0,0) inscrito no quadrado.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main(){
  int n;
  int cont;
  double x;
  double y;
  while(1){
    printf("Entre com quantidade de pontos escolhidos:");
    scanf("%d",&n);
    cont = 0;
    srand ( time(NULL) ); 
    for(int i=0;i<n;i++){
      x = (double)rand()/RAND_MAX;
      y = (double)rand()/RAND_MAX;  
      if(x*x + y*y <= 1 ) cont++;
    }
    printf("%lf\n",(4.0*cont)/n);    
  }
} 


Execução do Algoritmo:
Entre com quantidade de pontos escolhidos:100
3.240000
Entre com quantidade de pontos escolhidos:1000
3.128000
Entre com quantidade de pontos escolhidos:10000
3.157200
Entre com quantidade de pontos escolhidos:100000
3.142200
Entre com quantidade de pontos escolhidos:1000000
3.140468
Entre com quantidade de pontos escolhidos:10000000
3.141982
Entre com quantidade de pontos escolhidos:100000000
3.141579
Entre com quantidade de pontos escolhidos:1000000000
3.141509
Entre com quantidade de pontos escolhidos:2000000000
3.141525
1) Desenvolver um algoritmo que analisa todos os pontos inteiros dentro do quadrado de lado 2*r e conta quantos pontos caem dentro do círculo com raio r com centro no ponto (0,0) inscrito no quadrado.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>


int main(){
  int r;
  int cont;
  int total;
  
  while(1){
    printf("Entre o raio do circulo:");
    scanf("%d",&r);
    
    total = 0;
    cont = 0;
    
    for(int i=-r;i<=r;i++){
      for(int j=-r;j<=r;j++){
        total++;
        if(i*i + j*j <= r*r) cont++;
      }
    }
    
    printf("%lf\n",(4.0*cont)/total);    
  }
  system("PAUSE");
  

}

Execução do algoritmo:

Entre o raio do circulo:10
2.875283
Entre o raio do circulo:100
3.110517
Entre o raio do circulo:1000
3.138410
Entre o raio do circulo:10000
3.141276

Apesar da complexidade do segundo algoritmo ser muito maior, podemos brincar um pouco com a simetria do círculo inscrito no quadrado.





#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(){
  int r;
  long long cont;
  long long total;
  while(1){
    printf("Entre o raio do circulo:");
    scanf("%d",&r);
    total = 0LL;
    cont = 0LL;
    for(int i=0;i<=r;i++){
      for(int j=0;j<=i;j++){
        total++;
        if(i*i + j*j <= r*r) cont++;
      }
    }
    printf("%lf\n",(4.0*cont)/total);    
  }
  system("PAUSE");
}


Execução do Algoritmo:
Entre o raio do circulo:10

2.969697
Entre o raio do circulo:100
3.116288
Entre o raio do circulo:1000
3.138961
Entre o raio do circulo:10000
3.141331

Nenhum comentário: