【问题描述】如果在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;
}
【测评结果】