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\n");

		else printf("%d\n",ans);

	}

	

}



 

你可能感兴趣的:(it)