题解:洛谷 B4552 交税

【题目来源】

洛谷:B4552 [GESP202606 一级] 交税 - 洛谷

【题目描述】

根据国家税收相关规定,劳务报酬需要按月预交个税,预交税率如下:

  1. 劳务报酬不超过 \(800\) 的,不需要预交个税;
  2. 劳务报酬超过 \(800\) 的,仅超过 \(800\) 的部分按照 \(20\%\)(即 \(0.2\))税率预交个税(不超过 \(800\) 的部分不需要预交个税);

例如,月劳务报酬为 \(1000.0\),则按照规则 \(2\) 需要预交个税 \((1000.0 - 800.0) \times 20\% = 40.00\)

现在给定小杨同学 \(12\) 个月的月度劳务报酬,请帮小杨同学计算他这 \(12\) 个月应预交个税的总和。

【输入】

输入 \(12\) 行,每行一个浮点数,表示小杨同学 \(12\) 个月中每个月的劳务报酬。

每个浮点数恰好有一位小数。

【输出】

输出 \(1\) 行,一个浮点数,保留两位小数,表示小杨同学 \(12\) 个月应预交个税的总和。

【输入样例】

932.0
1634.3
1790.4
2172.9
378.1
283.4
2761.9
3583.5
10.1
2324.9
1111.6
3812.3

【输出样例】

2584.76

【核心思想】

  1. 问题分析:给定 \(12\) 个月的劳务报酬,每个月的个税计算规则为分段函数:若报酬 \(x \leq 800\),个税为 \(0\);若 \(x > 800\),个税为 \((x - 800) \times 0.2\)。需要累加 \(12\) 个月的个税并保留两位小数输出。本质是简单的分段函数求和。

  2. 算法选择

    • 直接模拟:逐月读取报酬,按规则计算当月个税并累加
  3. 关键步骤

    • 初始化:累计个税 \(ans = 0\)
    • 逐月处理(循环 \(i\)\(1\)\(12\)):
      • 读取当月劳务报酬 \(x\)
      • \(x > 800\)\(ans \leftarrow ans + (x - 800) \times 0.2\)
      • \(x \leq 800\):不增加(个税为 \(0\)
    • 输出结果:保留两位小数输出 \(ans\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(12) = O(1)\),固定次数的输入和计算
    • 空间复杂度:\(O(1)\),仅使用两个浮点变量
  5. 分段函数模拟的核心思想

    • 阈值判断:以 \(800\) 为分界点,将连续的数值域划分为两个区间,分别对应不同的计算规则
    • 线性累加:每个月的个税计算相互独立,无跨月依赖,因此直接遍历累加即可
    • 浮点精度控制:输入为一位小数,输出要求两位小数,使用 double 类型配合格式化输出 %.2lf 即可满足精度要求
    • 适用于规则明确、无状态依赖的简单税务/费用计算问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;

double x, ans;                     // x: 每个月的劳务报酬; ans: 累计应预交的个税总和

int main()
{
    for (int i = 1; i <= 12; i++)  // 循环处理 12 个月的劳务报酬
    {
        cin >> x;                  // 读入当前月的劳务报酬

        if (x > 800)               // 如果劳务报酬超过 800,超过部分需要预交个税
            ans += (x - 800) * 0.2;  // 累加超过 800 部分的 20% 税率
    }

    printf("%.2lf", ans);          // 输出 12 个月预交个税总和,保留两位小数

    return 0;
}

【运行结果】

932.0
1634.3
1790.4
2172.9
378.1
283.4
2761.9
3583.5
10.1
2324.9
1111.6
3812.3
2584.76
posted @ 2026-07-01 14:02  团爸讲算法  阅读(67)  评论(0)    收藏  举报