题解:洛谷 B4552 [GESP202606 一级] 交税

📅 2026/7/4 21:16:28 👁️ 阅读次数 📝 编程学习
题解:洛谷 B4552 [GESP202606 一级] 交税

【题目来源】

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

【题目描述】

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

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

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

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

【输入】

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

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

【输出】

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

【输入样例】

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 1212个月的劳务报酬,每个月的个税计算规则为分段函数:若报酬x ≤ 800 x \leq 800x800,个税为0 00;若x > 800 x > 800x>800,个税为( x − 800 ) × 0.2 (x - 800) \times 0.2(x800)×0.2。需要累加12 1212个月的个税并保留两位小数输出。本质是简单的分段函数求和。

  2. 算法选择

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

    • 初始化:累计个税a n s = 0 ans = 0ans=0
    • 逐月处理(循环i ii1 1112 1212):
      • 读取当月劳务报酬x xx
      • x > 800 x > 800x>800a n s ← a n s + ( x − 800 ) × 0.2 ans \leftarrow ans + (x - 800) \times 0.2ansans+(x800)×0.2
      • x ≤ 800 x \leq 800x800:不增加(个税为0 00
    • 输出结果:保留两位小数输出a n s ansans
  4. 时间/空间复杂度

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

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

【算法标签】

#入门 #模拟

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;doublex,ans;// x: 每个月的劳务报酬; ans: 累计应预交的个税总和intmain(){for(inti=1;i<=12;i++)// 循环处理 12 个月的劳务报酬{cin>>x;// 读入当前月的劳务报酬if(x>800)// 如果劳务报酬超过 800,超过部分需要预交个税ans+=(x-800)*0.2;// 累加超过 800 部分的 20% 税率}printf("%.2lf",ans);// 输出 12 个月预交个税总和,保留两位小数return0;}

【运行结果】

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