【题目来源】
洛谷:B4552 [GESP202606 一级] 交税 - 洛谷
【题目描述】
根据国家税收相关规定,劳务报酬需要按月预交个税,预交税率如下:
- 劳务报酬不超过800 800800的,不需要预交个税;
- 劳务报酬超过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.0−800.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【核心思想】
问题分析:给定12 1212个月的劳务报酬,每个月的个税计算规则为分段函数:若报酬x ≤ 800 x \leq 800x≤800,个税为0 00;若x > 800 x > 800x>800,个税为( x − 800 ) × 0.2 (x - 800) \times 0.2(x−800)×0.2。需要累加12 1212个月的个税并保留两位小数输出。本质是简单的分段函数求和。
算法选择:
- 直接模拟:逐月读取报酬,按规则计算当月个税并累加
关键步骤:
- 初始化:累计个税a n s = 0 ans = 0ans=0
- 逐月处理(循环i ii从1 11到12 1212):
- 读取当月劳务报酬x xx
- 若x > 800 x > 800x>800:a n s ← a n s + ( x − 800 ) × 0.2 ans \leftarrow ans + (x - 800) \times 0.2ans←ans+(x−800)×0.2
- 若x ≤ 800 x \leq 800x≤800:不增加(个税为0 00)
- 输出结果:保留两位小数输出a n s ansans
时间/空间复杂度:
- 时间复杂度:O ( 12 ) = O ( 1 ) O(12) = O(1)O(12)=O(1),固定次数的输入和计算
- 空间复杂度:O ( 1 ) O(1)O(1),仅使用两个浮点变量
分段函数模拟的核心思想:
- 阈值判断:以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