【题目】
你的信用卡目前欠M元,每月的汇率是R,每月的利息要四舍五入为小数点后两位,你每月还B元,问多少月能还清。
输入
先是T代表测试数据组数
接下来T行,每行有三个实数,R,M,B每个实数小数点后有两位
输出
每组测试数据输出一行,还清债务的最小月数,如果超过1200月都不能还清,输出“impossible”
【吐槽】
这道题过的好不容易,首先是读题,如果不了解那些银行业的词汇真读不懂题
比如interesting(利息),the outstanding balance(未付清的余额),payment(题目的意思应该是还款还多少月)。最难懂得是那个四舍五入:rounding up 0.5 cent and above,意思是0.5~1分向上取整。因为没有读懂最后那个,WA了无数次。。捂脸
【题解】
题目明确了还是很好算的,只需while一直循环就好了,只需注意一点,也是很多同学一直过不去的,就是浮点误差,0.005要约为0.01,但因为浮点误差所以有时候是0.00499999这时候也需要约为0.01,而不是0.00
【代码】
RunID |
User |
Problem |
Result |
Memory |
Time |
Language |
Length |
Submit Time |
2549916 |
Accepted |
0 KB |
33 ms |
707 B |
2014-07-31 16:36:07 |
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #define eps 0.000001//规定浮点误差范围,一般取这个数就可以了 using namespace std; int i,j,k,n,x,y,T,ans; double r,m,b; double rou(double t) { double x=t*100; double y=round(x); if (fabs(x-y)<eps) return t; x=(int)(x+0.5+eps); x=x/100; return x; } int main() { scanf("%d",&T); while (T--) { scanf("%lf%lf%lf",&r,&m,&b); ans=0; while (m>eps) { ans++; if (ans>1200) break; m=m+rou(r*m*0.01); m-=b; } if (ans>1200) printf("impossible\n"); else printf("%d\n",ans); } }