LA 6448 Credit Card Payment

 

 

【题目】

你的信用卡目前欠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

zhyfzy

E

Accepted

0 KB

33 ms

C++ 4.5.3

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
");
		else printf("%d
",ans);
	}
	
}



原文地址:https://www.cnblogs.com/zhyfzy/p/4021319.html