0
点赞
收藏
分享

微信扫一扫

二分法求利率(非线性方程求解)

戴老师成长记录仪 2022-05-01 阅读 97
c++

【问题描述】如果在240个月内每月付款300美元,使用二分法在利率区间[a,b] 内,求能够满足在这240个月之后使本金和利息的总值达到50万美元的利率值,精确到小数点后第d位。

【输入形式】在屏幕上输入3个数,依次为利率区间左端点值a、右端点值b和精确到小数点后d位。各数间都以一个空格分隔。测试用例的输入满足:b>a>0, 1<=d<=8, d为正整数。若在区间[a, b]内没有根,则输出error。

【输出形式】输出两行数据,第一行为迭代次数,第二行为求得的利率,保留d位小数。

【样例1输入】

0.15 0.16 8

【样例1输出】

20

0.15753931

【样例说明】输入:左端点值为0.15,右端点值为0.16,求得的利率精确到小数点后8位。输出:表示经 20 次迭代,求得满足条件的利率值为 0.15753931。

【样例2输入】

0.16 0.17 8

【样例1输出】

error

【样例说明】输入:左端点值为0.16,右端点值为0.17,求得的利率精确到小数点后8位。输出:error,表示在区间[0.16, 0.17]内没有根。

【代码如下】

//二分法求利率
#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
int main()
{
	double a,b,c;
	int d,n=-1,star=1;
	cin>>a>>b>>d;
	while((b-a)>(0.5*pow(0.1,d)))
	{
		if((((300*12)*((pow((1+a/12.0),240)-1))/a)-500000)*(((300*12)*((pow((1+b/12.0),240)-1))/b)-500000)>0)
		{star=0;break;}
		c=(a+b)/2.0;
		if(((300*12)*((pow((1+c/12.0),240)-1))/c-500000)==0)
		{
			n++;
			break;
		}
		else if((((300*12)*((pow((1+a/12.0),240)-1))/a)-500000)*(((300*12)*((pow((1+c/12.0),240)-1))/c)-500000)<0)
		{
			n++;
			b=c;
		}
		else
		{
			n++;
			a=c;
		}
	}
	if(star==0)cout<<"error";
	else
	{
		cout<<n<<"\n"; 
		cout<<fixed<<setprecision(d)<<c;
	}
	
	return 0;
}

【测评结果】

举报

相关推荐

0 条评论