//float dichotomy(float);
//int isans(float n, float x,float c,int b);//分号.
/*
fabs和abs;
功能不同:
fabs函数功能为:求浮点数x的绝对值。ABS函数的功能为求整数的绝对值。
4、引用的头文件不同:
abs函数引用的头文件:stdlib.h,fabs函数引用的头文件为math.h。
*/
float still_owe(float x, float n, float a, int b, float c);//欲求出欠款n关于利息x的函数,参数较多,因为需要借助迭代
int main()
{
  /* 定义了不少变量,务必在运行之前检查下类型
  包括自定义的函数原型(定义和声明中)的参数变量类型*/
  float a = 0, x = 0;
  float c = 0;/* 每个月的还款数额 */
  int b;//分b个月来还
  float n = 0;/* still_owe_money */
        /* 二分法左边界 */
  float left = 0.000000;
  float right = 1.000000;//
  float value_left = 0, value_right = 0, value_mid = 0;
  int i;/* 循环变量 */
      // x = (left + right)/2.0;/* 最终的x将会是某个足够小的二分区间中间值mid
      //  x是需要被迭代的,应该放在某个循环中去. */
  //printf("test_new_2\n");
  scanf("%f%d%f", &a, &b, &c);
  n = a;
  value_left = still_owe(left, n, a, b, c);
  value_right = still_owe(right, n, a, b, c);
  x = (left + right) / 2.0;
  value_mid = still_owe(x, n, a, b, c);
  for (; fabs(value_right - value_left) > 0.0001; x = (left + right) / 2.0)
  {
    /* 函数值赋值,这些值也需要及时迭代 */
        value_left = still_owe(left, n, a, b, c);
        value_right = still_owe(right, n, a, b, c);
        //x = (left + right) / 2.0;
        value_mid = still_owe(x, n, a, b, c);
      // if(abs(value_right - value_left)<0.000001)/* 精度交给区间边界值 */
      //     printf("%.6f",x);
      // else
      /* 精度不满足要求.需要调整区间边界,提高精度 */
      /* 调整之前,还需要求函数值(中间变量的函数值):  value_mid = still_owe(x,n,a,b,c);
      对函数值进行判断(零点存在性定理) */
      /* 若,零点在原区间左半边 */
      if (value_left * value_mid <= 0)
        right = x;//迭代边界值
              /* 若零点在有半边 */
      else
      {
        left = x;
      }
    //printf("working\n");
  }
  printf("%.3f%%\n", x * 100);//%.nf可以自动四舍五入
  return 0;
}
float still_owe(float x, float n, float a, int b, float c)
{
  n = a;
  for (int i = 0; i<b; i++)
  {
    n = n*(1 + x) - c;
  }
  return n;
}                
                
