#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
); return EXIT_FAILURE;
}
while(fscanf(fp
, "%u", &cnt
)==1){ // read a line
if(cnt==0) break;
++cnt;
for(i=0; i<cnt; ++i)
// process
Rate = BiSector(C, cnt, 0.0, 1.0, IRR_func, EPS, MAX_ITERATOR);
printf("%lf %%\n", Rate
* 100.0); }
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPiAvLyBzaXplX3QKI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgTUFYX1NJWkUgMjAKCiNkZWZpbmUgTUFYX0lURVJBVE9SIDIwMAojZGVmaW5lIEVQUyAxRS05CiNkZWZpbmUgRklMRU5BTUUgImlucHV0LnR4dCIKCgovLyDku6PlhaUgQ1tzaXplXSwgcgovLyDmsYIgZihyKSA9IEMwICsgQzEvKDErcikxICsgQzIvKDErcikyICsgQzMvKDErcikzICsgLi4uICsgQ24vKDErciluCmRvdWJsZSBJUlJfZnVuYyhkb3VibGUgKkMsIHNpemVfdCBzaXplLCBkb3VibGUgcikKewoJc2l6ZV90IG47Cglkb3VibGUgcjEgPSAoMS4wK3IpOwoJZG91YmxlIHJuID0gcjE7Cglkb3VibGUgc3VtID0gQ1swXTsKCWZvcihuPTE7IG48c2l6ZTsgKytuKXsKCQlzdW0rPSBDW25dL3JuOwoJCXJuKj1yMTsgLy8gcm4gPSAoMStyKV5uCgl9CglyZXR1cm4gc3VtOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRvdWJsZSBCaVNlY3RvcigKCWRvdWJsZSAqQywgICAgICAgICAgICAgIC8qIOavj+acn+mHkea1gSAgKi8KCXNpemVfdCBuLCAgICAgICAgICAgICAgIC8qIOWFsSBuIOacnyAqLwoJZG91YmxlIGxvdywgICAgICAgICAgICAgLyogICBy5LiL55WMICAqLwoJZG91YmxlIHVwLCAgICAgICAgICAgICAgLyogICBy5LiK55WMICAqLwoJZG91YmxlICgqZngpKGRvdWJsZSosIHNpemVfdCAsZG91YmxlICksLyog6YGp5oeJ5Ye95byPKi8KCWRvdWJsZSBlcHMsICAgICAgICAgICAgIC8qIOWuueioseiqpOW3riovCglpbnQgbWF4X2l0ZXJhKSAgICAgICAgICAvKiDmnIDlpKfov63ku6MqLwp7Cglkb3VibGUgbWlkLCB5OwoJZG91YmxlIHl1cCA9IGZ4KEMsIG4sIHVwKTsKCglpZiggeXVwICpmeChDLCBuLCBsb3cpID4gMC4wKSB7CgkJcHJpbnRmKCJcbj4gICBoYXMgbm8gcm9vdCBhdCBbJWxmLCAlbGZdIiwgbG93LCB1cCk7CgkJcmV0dXJuIGxvdzsKCX0KCWRvewoJCW1pZCA9IChsb3crdXApKjAuNTsKCQl5ICAgPSBmeChDLCBuLCBtaWQpOwoJCWlmKHkgKiB5dXAgPD0gMC4wKSBsb3cgPSBtaWQ7CgkJZWxzZSB1cCA9IG1pZCwgeXVwPXk7CgkJLS1tYXhfaXRlcmE7Cgl9d2hpbGUobWF4X2l0ZXJhICYmIGZhYnMoeSkgPiBlcHMpOwoJcmV0dXJuIG1pZDsKfQoKLy8KaW50IG1haW4oKQp7CgkKCWRvdWJsZSBDW01BWF9TSVpFXSA9IHswLjB9OyAKCXNpemVfdCBpLCBjbnQ9MDsKCWRvdWJsZSBSYXRlPTAuMDsKCgkvLyByZWFkIGZyb20gZmlsZS4KCUZJTEUgKmZwID0gZm9wZW4oRklMRU5BTUUsICJyIik7CglpZihmcD09TlVMTCl7CgkJcHJpbnRmKCJvcGVuICVzIGZpbGUgZmFpbC5cbiIsIEZJTEVOQU1FKTsKCQlnZXRjaGFyKCk7CgkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKCX0KCXdoaWxlKGZzY2FuZihmcCwgIiV1IiwgJmNudCk9PTEpewoJCS8vIHJlYWQgYSBsaW5lCgkJaWYoY250PT0wKSBicmVhazsKCQkrK2NudDsKCQlmb3IoaT0wOyBpPGNudDsgKytpKQoJCQlmc2NhbmYoZnAsICIlbGYiLCAmQ1tpXSk7CgkJLy8gcHJvY2VzcwoJCVJhdGUgPSBCaVNlY3RvcihDLCBjbnQsIDAuMCwgMS4wLCBJUlJfZnVuYywgRVBTLCBNQVhfSVRFUkFUT1IpOwoJCXByaW50ZigiJWxmICUlXG4iLCBSYXRlICogMTAwLjApOwoJfQoJZmNsb3NlKGZwKTsKCglzeXN0ZW0oInBhdXNlIik7CglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9