fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stddef.h> // size_t
  4. #include <math.h>
  5.  
  6. #define MAX_SIZE 20
  7.  
  8. #define MAX_ITERATOR 200
  9. #define EPS 1E-9
  10. #define FILENAME "input.txt"
  11.  
  12.  
  13. // 代入 C[size], r
  14. // 求 f(r) = C0 + C1/(1+r)1 + C2/(1+r)2 + C3/(1+r)3 + ... + Cn/(1+r)n
  15. double IRR_func(double *C, size_t size, double r)
  16. {
  17. size_t n;
  18. double r1 = (1.0+r);
  19. double rn = r1;
  20. double sum = C[0];
  21. for(n=1; n<size; ++n){
  22. sum+= C[n]/rn;
  23. rn*=r1; // rn = (1+r)^n
  24. }
  25. return sum;
  26. }
  27.  
  28. // -------------------------------------------------------
  29. double BiSector(
  30. double *C, /* 每期金流 */
  31. size_t n, /* 共 n 期 */
  32. double low, /* r下界 */
  33. double up, /* r上界 */
  34. double (*fx)(double*, size_t ,double ),/* 適應函式*/
  35. double eps, /* 容許誤差*/
  36. int max_itera) /* 最大迭代*/
  37. {
  38. double mid, y;
  39. double yup = fx(C, n, up);
  40.  
  41. if( yup *fx(C, n, low) > 0.0) {
  42. printf("\n> has no root at [%lf, %lf]", low, up);
  43. return low;
  44. }
  45. do{
  46. mid = (low+up)*0.5;
  47. y = fx(C, n, mid);
  48. if(y * yup <= 0.0) low = mid;
  49. else up = mid, yup=y;
  50. --max_itera;
  51. }while(max_itera && fabs(y) > eps);
  52. return mid;
  53. }
  54.  
  55. //
  56. int main()
  57. {
  58.  
  59. double C[MAX_SIZE] = {0.0};
  60. size_t i, cnt=0;
  61. double Rate=0.0;
  62.  
  63. // read from file.
  64. FILE *fp = fopen(FILENAME, "r");
  65. if(fp==NULL){
  66. printf("open %s file fail.\n", FILENAME);
  67. return EXIT_FAILURE;
  68. }
  69. while(fscanf(fp, "%u", &cnt)==1){
  70. // read a line
  71. if(cnt==0) break;
  72. ++cnt;
  73. for(i=0; i<cnt; ++i)
  74. fscanf(fp, "%lf", &C[i]);
  75. // process
  76. Rate = BiSector(C, cnt, 0.0, 1.0, IRR_func, EPS, MAX_ITERATOR);
  77. printf("%lf %%\n", Rate * 100.0);
  78. }
  79. fclose(fp);
  80.  
  81. system("pause");
  82. return EXIT_SUCCESS;
  83. }
Runtime error #stdin #stdout 0.01s 1856KB
stdin
Standard input is empty
stdout
open input.txt file fail.