primero
Código
if(n%2==0){ cout<<"numero invalido"<<endl;
por que si es par es invalido? es una progresion, toma presicion al avanzar, la paridad no importa en valores altos...
Código
int b=0,a=1,i,c=0 ; for(i=1;i<=n;i++){ if(i%2==0){ while(a<=n){ b=b-(4/a); a=a+2; } cout<<b<<endl; }else{ while(a<=n){ c=c+(4/a); a=a+2; } cout<<c<<endl; } }
el error es que es una sumatoria.... una UNICA sumatoria.... tu lo que estás haciendo son 2 sumatorias... una negativa y otra positiva... para ambos debe ser "b" el valor afectado
otra cosa...
sabemos que pi es un numero decimal, especialmente esta operación requiere de decimales... si te fijas la haces con enteros.... jamás dará resultado...
personalmente lo habría hecho así (super compacto XD)
Código
#include <iostream> using namespace std; int main(){ int precision, i = 0; float pi = 4; cout << "ingrese un grado de precision: "; cin >> precision; while (i++ < precision)pi += ((i%2==0?4:-4)/(1+i*2.0f)); printf ("\npi es: %.10f \n" , pi); system("pause"); return 0; }
desgloso un poquito:
-en la división hago algo similar a
Código
if(i%2==0) { pi = pi + (4 / (i*2.0f) ); }else{ pi = pi - (4 / (i*2.0f) ); }
este 2.0f es para que se force como flotante el resultado de la división, si no, la división quedará como entero (por ejemplo si haces 4/i, al ser i entero, el resultado es entero)
-en la impresión de datos no uso cout, sino printf con el valor "%.10f" esto significa que va a imprimir 10 decimales (aunque sean ceros)
espero sea de ayuda inténtalo correr con un valor de 1000000000 mi maquina lo corre en unos 20 seg y el valor dudo que lo puedas tener más aproximado XD