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