Calculando o PI em C ANSI
Mais um exercício de faculdade, a tarefa dada foi: desenvolver um program em C que retorne uma aproximação do PI, com base na fórmula de Leonhard Euler (veja figura e/ou o site da Universidade de Lisboa), O usuário deverá entrar com um número que determinará a precisão da aproximação, que para a fórmula servirá para gerar a quantidade de números primos (os números das bases das potencias dos numeradores da figura) depois da idéia esboçada em sala de aula, mas sem os recursos para o desenvolvimento, viemos para casa curiosos com o problema, resolvemos transformar a idéia em código e não é que funcionou? na verdade não sabemos se está correto, mas parece “casar” com várias aproximações encontradas na rede.
O Algoritmo:
A função principal (retorna_pi) faz um loop em função do numero que o usuário informa, “cria” os números primos, tantos quantos forem o número informado, para isto a função apenas vai incrementando um contador e através da função checa_primo, verifica se este contador é primo ou não, se sim faz o calculo do lado direito da equação de Leonhard Euler e vai acumulando, até que o número de primos alcance o numero informado pelo usuario, ao final multiplica a soma por 6 e extrai a raiz quadrada:
#include <stdio.h> #include <stdlib.h> #include <math.h>
// Prototipos int checaprimo(int num); double calculo1(unsigned int n); double retorna_pi(unsigned int nTimes);
void main(int argc, char *argv[])
{
unsigned int n;
system("cls");
printf("Entre com a precisao : ");
scanf("%i",&n);
printf("%.20f\n",retorna_pi(n));
printf("%s\n\n"," ");
system("PAUSE");
}// Calcula e retorna o PI
double retorna_pi(unsigned int nTimes)
{
double soma1=1, pi;
unsigned int primos=0, count=2;
do
{
if (checaprimo(count)==1)
{
soma1 = (soma1*calculo1(count));
primos++;
}
count++;
} while (primos<=nTimes);
return sqrt(soma1*6);
}// Calcula o lado direito da equacao de Leonhard Euler
double calculo1(unsigned int n) {
int n2=n*n, n2m1=n2-1;
return (double) n2 / n2m1;
}
// Verifica se o numero é primo
int checaprimo(int num)
{
for (int i=2; i<num; i++) if (num%i==0) return 0;
return 1;
}
Baixe o fonte e o executável aqui.