Calculando o PI em C ANSI

March 5th, 2011 Enviado em Desenvolvimento

Formula_PI1 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.

Deixe um comentário