根據月收入計算應納稅額。注意:此為**舊版個稅起征點 1600 元**標準(現行 5000 元),題目純算法練習。
| 應納稅所得額 (收入-1600) | 稅率 | 速算扣除數 |
|---|---|---|
| ≤ 0 | 0% | 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;
}
// 綜合所得稅:累進稅率 + 速算扣除數
// 應納稅所得額 = 收入 - 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;
}
| 收入 | 題目算法輸出 | 說明 |
|---|---|---|
| 1000 | 0.00 | 未超起征點 |
| 2000 | 20.00 | (2000-1600)×5% |
| 3000 | 140.00 | (3000-1600)×10% |
| 4000 | 360.00 | (4000-1600)×15% |
| 5000 | 680.00 | (5000-1600)×20% |
本題考察**分段函數邏輯、浮點數運算、格式化輸出**。教學簡化模型未使用速算扣除數,實際稅制更複雜。工程化關鍵:數據驅動稅率表、double 精度、錯誤處理、可擴展結構。理解新舊稅制差異,有助於財務系統開發與合規測試。