首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

PAT 基礎編程題解:分段函數計算個人所得稅(舊稅制)

     編輯:關於C語言

題目背景

根據月收入計算應納稅額。注意:此為**舊版個稅起征點 1600 元**標準(現行 5000 元),題目純算法練習。

稅率表

應納稅所得額 (收入-1600)稅率速算扣除數
≤ 00%0
≤ 900 (收入≤2500)5%0
≤ 1900 (收入≤3500)10%45
≤ 2900 (收入≤4500)15%135
> 2900 (收入>4500)20%315

題目簡化公式:`稅 = 稅率 × (收入 - 1600)`,未使用速算扣除數,屬教學簡化模型。

原代碼邏輯

float salary, *ps = &salary;
scanf("%f", ps);
if (*ps < 0) exit(0);

if (*ps <= 1600) printf("0.00\n");
else if (*ps <= 2500) printf("%.2f\n", 0.05 * (*ps - 1600));
else if (*ps <= 3500) printf("%.2f\n", 0.10 * (*ps - 1600));
else if (*ps <= 4500) printf("%.2f\n", 0.15 * (*ps - 1600));
else printf("%.2f\n", 0.20 * (*ps - 1600));

問題與優化

問題影響改進
多獨立 if 非互斥雖數據保證互斥,但邏輯不清晰改用 if-else if 鏈
浮點數精度float 7 位有效數字,大額收入精度不足改用 double,或整數分單位存儲
硬編碼閾值維護困難,擴展性差定義結構體數組存儲稅率表
負數直接 exit未給錯誤提示,用戶體驗差輸出錯誤信息再退出

工程化重構:數據驅動稅率表

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    double upper;   // 該級上限收入
    double rate;    // 稅率
} TaxBracket;

const TaxBracket brackets[] = {
    {1600, 0.00},
    {2500, 0.05},
    {3500, 0.10},
    {4500, 0.15},
    {1e9,  0.20}   // 無上限
};
const int BRACKET_COUNT = sizeof(brackets)/sizeof(brackets[0]);
const double THRESHOLD = 1600.0;

int main() {
    double salary;
    if (scanf("%lf", &salary) != 1) return 1;
    if (salary < 0) {
        fprintf(stderr, "Error: salary cannot be negative\n");
        return 1;
    }

    double tax = 0.0;
    for (int i = 0; i < BRACKET_COUNT; ++i) {
        if (salary <= brackets[i].upper) {
            tax = brackets[i].rate * (salary - THRESHOLD);
            break;
        }
    }
    printf("%.2f\n", tax);
    return 0;
}

現行個稅算法對比(2019 新制)

// 綜合所得稅:累進稅率 + 速算扣除數
// 應納稅所得額 = 收入 - 5000 - 專項扣除 - 專項附加扣除 - 其他
double calc_tax_new(double taxable_income) {
    static const struct { double upper, rate, quick; } t[] = {
        {36000,   0.03, 0},
        {144000,  0.10, 2520},
        {300000,  0.20, 16920},
        {420000,  0.25, 31920},
        {660000,  0.30, 52920},
        {960000,  0.35, 85920},
        {1e9,     0.45, 181920}
    };
    for (int i=0; i<7; ++i)
        if (taxable_income <= t[i].upper)
            return taxable_income * t[i].rate - t[i].quick;
    return 0;
}

測試驗證

收入題目算法輸出說明
10000.00未超起征點
200020.00(2000-1600)×5%
3000140.00(3000-1600)×10%
4000360.00(4000-1600)×15%
5000680.00(5000-1600)×20%

總結

本題考察**分段函數邏輯、浮點數運算、格式化輸出**。教學簡化模型未使用速算扣除數,實際稅制更複雜。工程化關鍵:數據驅動稅率表、double 精度、錯誤處理、可擴展結構。理解新舊稅制差異,有助於財務系統開發與合規測試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved