#include <stdio.h>
#include <stdlib.h>
#include <stddef.h> // size_t
#include <math.h>

#define MAX_SIZE 20

#define MAX_ITERATOR 200
#define EPS 1E-9
#define FILENAME "input.txt"


// 代入 C[size], r
// 求 f(r) = C0 + C1/(1+r)1 + C2/(1+r)2 + C3/(1+r)3 + ... + Cn/(1+r)n
double IRR_func(double *C, size_t size, double r)
{
	size_t n;
	double r1 = (1.0+r);
	double rn = r1;
	double sum = C[0];
	for(n=1; n<size; ++n){
		sum+= C[n]/rn;
		rn*=r1; // rn = (1+r)^n
	}
	return sum;
}

// -------------------------------------------------------
double BiSector(
	double *C,              /* 每期金流  */
	size_t n,               /* 共 n 期 */
	double low,             /*   r下界  */
	double up,              /*   r上界  */
	double (*fx)(double*, size_t ,double ),/* 適應函式*/
	double eps,             /* 容許誤差*/
	int max_itera)          /* 最大迭代*/
{
	double mid, y;
	double yup = fx(C, n, up);

	if( yup *fx(C, n, low) > 0.0) {
		printf("\n>   has no root at [%lf, %lf]", low, up);
		return low;
	}
	do{
		mid = (low+up)*0.5;
		y   = fx(C, n, mid);
		if(y * yup <= 0.0) low = mid;
		else up = mid, yup=y;
		--max_itera;
	}while(max_itera && fabs(y) > eps);
	return mid;
}

//
int main()
{
	
	double C[MAX_SIZE] = {0.0}; 
	size_t i, cnt=0;
	double Rate=0.0;

	// read from file.
	FILE *fp = fopen(FILENAME, "r");
	if(fp==NULL){
		printf("open %s file fail.\n", FILENAME);
		getchar();
		return EXIT_FAILURE;
	}
	while(fscanf(fp, "%u", &cnt)==1){
		// read a line
		if(cnt==0) break;
		++cnt;
		for(i=0; i<cnt; ++i)
			fscanf(fp, "%lf", &C[i]);
		// process
		Rate = BiSector(C, cnt, 0.0, 1.0, IRR_func, EPS, MAX_ITERATOR);
		printf("%lf %%\n", Rate * 100.0);
	}
	fclose(fp);

	system("pause");
	return EXIT_SUCCESS;
}