题目描述
神仙由于刚到凡间故手上缺钱,于是她去银行贷款了。因此,她在贷款之后,在一段时间内将不得不每月偿还固定的分期付款。这个问题要求计算神仙向银行支付的利率。假设利率按月累计。
输入
输入仅一行包含三个用空格隔开的正整数。第一个整数表示贷款的原值,第二个整数表示每月支付的分期付款金额,第三个整数表示分期付款还清贷款所需的总月数。
输出
输出一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到0.1%。
样例输入 Copy
1000 100 12
样例输出 Copy
2.9
将利率二分,check可行性
#include <bits/stdc++.h> #include <algorithm> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> using namespace std; #define wuyt main typedef long long ll; #define HEAP(...) priority_queue<__VA_ARGS__ > #define heap(...) priority_queue<__VA_ARGS__,vector<__VA_ARGS__ >,greater<__VA_ARGS__ > > template<class T> inline T min(T &x,const T &y){return x>y?y:x;} template<class T> inline T max(T &x,const T &y){return x<y?y:x;} ///#define getchar()(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++) ///char buf[(1 << 21) + 1], *p1 = buf, *p2 = buf; ll read(){ll c = getchar(),Nig = 1,x = 0;while(!isdigit(c) && c!='-')c = getchar(); if(c == '-')Nig = -1,c = getchar(); while(isdigit(c))x = ((x<<1) + (x<<3)) + (c^'0'),c = getchar(); return Nig*x;} #define read read() const ll inf = 1e15; const int maxn = 2e5 + 7; const int mod = 1e9 + 7; const double limit=1e-6;///在后面有用到二分的精度问题在这里设为常量 #define start int wuyt() #define end return 0 ll num[20008]; ll num2[20008]; int n,m,cnt; ll gcd(ll a,ll b) { ll t; while(b!=0) { t=a%b; a=b; b=t; } return a; } ll ans; ll qPow(ll x, ll k) { ll res = 1; while(k) { if(k&1) res=(res*x); k>>=1; x=(x*x); } return res; } bool check(double number){ double temp=0; for(int i=1;i<=cnt;i++) temp+=n/pow(1+number,i); if(temp>=m) return 1; else return 0; } ///ll a[40][40]; ll a,b; char ss[50]; int pos; bool judge(ll num[]){ for(int i=1;i<=2*n;i++){ if(i!=num[i]) return false; } return true; } void work(ll num[],ll num2[]){ int cnt=1; for(int i=2*n;i>n;i--){ num2[i-cnt]=num[i]; cnt++; } for(int i=1;i<=n;i++){ num2[2*i]=num[i]; } for(int i=1;i<=2*n;i++) num[i]=num2[i]; } int main() { m=read,n=read,cnt=read; double left=0,right=100; double mid; while(right-left>limit){ mid=(left+right)/2; if(check(mid)) left=mid; else right=mid; } printf("%.1f\n",left*100); return 0; }
对于这里的:
bool check(double number){ double temp=0; for(int i=1;i<=cnt;i++) temp+=n/pow(1+number,i); if(temp>=m) return 1; else return 0; }
用不上自己写的快速幂,然后就用了库函数pow,但是这个函数有时候坑比较大,有条件的可以自己写一个为好
还需要注意的就是利率的算法