#include
#include
#include
//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;
}