/* 小明在攒够房子的首付款后 一次性地向银行贷款借了a元钱,并约定分b个月还清。 如果银行要求每月还贷c元钱,请问月利率x是多少(按照复利计息法计算)? 提示:按照复利计息法,第一个

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

你可能感兴趣的:(/* 小明在攒够房子的首付款后 一次性地向银行贷款借了a元钱,并约定分b个月还清。 如果银行要求每月还贷c元钱,请问月利率x是多少(按照复利计息法计算)? 提示:按照复利计息法,第一个)