#include <stdio.h>
#include <math.h>
#include <limits>
using namespace std;
static const double EPS = 1e-9;
int t, cash_flow[11];
double npv(double irr) {
double npv = cash_flow[0];
double irr_plus_1 = irr + 1;
double irr_plus_1_power = 1;
for (int i = 1; i <= t; i++) {
irr_plus_1_power *= irr_plus_1;
npv += cash_flow[i] / irr_plus_1_power;
}
return npv;
}
int main() {
scanf("%d", &t);
while (t != 0) {
scanf("%d", &cash_flow[0]);
for (int i = 1; i <= t; i++)
scanf("%d", &cash_flow[i]);
double best_sol = fabs(npv(-0.99)), sol = -0.99;
double ini = -0.999, fin = numeric_limits<double>::max();
while (ini + EPS <= fin) {
double mid = (ini + fin) / 2;
double npv_mid = npv(mid);
if (fabs(npv_mid) < best_sol) {
best_sol = fabs(npv_mid);
sol = mid;
}
if (npv_mid > EPS)
ini = mid;
else
fin = mid;
}
/*if (round(sol * 100) == 0)
sol = 0;*/
printf("%0.2f\n", sol);
scanf("%d", &t);
}
return 0;
}
Friday, April 24, 2015
UVa 11881 - Internal Rate of Return
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment