P12133 利息计算问题

题目链接

毒瘤精度题。

题目思路

本身并不难想。根据小学知识,我们知道利息公式为:

\[ \text{利息} = \text{利率} \times \text{本金} \times \text{时间} \]

所以每天的钱我们可以根据这个公式算出来,再加上本金。但是,毒瘤就毒瘤在了精度问题,我们可以使用加偏移量的方式来确保正确性,每次再特判利息小于 0.01 的情况就可以了。

注意:由于浮点数精度问题,直接计算可能会导致结果不准确。我们使用偏移量(eps)和向下取整(floor)来确保精度正确。

时间复杂度 \(O(M)\)。

完整代码

/*
    Author: MingDynasty
    Problem: https://www.luogu.com.cn/problem/P12313
*/
#include<bits/stdc++.h>
#define eps 1e-8
using namespace std;
int m;
double sum,a;
int main(){
    cin.tie(0)->sync_with_stdio(0);
    cin>>m;
    while(m--){
        cin>>a;
        double l=floor(sum*0.00005*100+eps)/100;
        sum=sum+a+(l<0.01?0:l);
        printf("%.2lf\n",floor((sum+eps)*100)/100);
    }
    return 0;
}

算法解析

1. 利息计算:根据公式,利息 = 本金 × 利率 × 时间。这里利率是0.005%,时间按天计算。

2. 精度处理

3. 关键点

—— MingDynasty