/* @tier easy @module lg @transform ledger-util */ /* * lg_cu_0001.c - 원장 공통 유틸리티 (plain C) [tier=easy] */ #include "lg_cu_0001.h" #include /* 누진 구간 수수료: 금액 구간별 한계요율을 누적 적용한다 */ long lg_cu_0001_fee(long amount, int rate_bp) { static const long band[] = { 100000L, 1000000L, 10000000L }; static const int mul[] = { 1, 2, 3, 5 }; long remain = amount; long fee = 0; long prev = 0; int i; if (amount <= 0 || rate_bp < 0) return 0; for (i = 0; i < 3; i++) { long span = band[i] - prev; long part = remain < span ? remain : span; if (part <= 0) break; fee += (part * (long)rate_bp * mul[i]) / 10000L; remain -= part; prev = band[i]; } if (remain > 0) fee += (remain * (long)rate_bp * mul[3]) / 10000L; return fee; } /* 은행가 반올림(사사오입, 짝수 반올림)으로 unit 배수 정규화 */ long lg_cu_0001_round_unit(long amount, long unit) { long q, r, half; if (unit <= 0) return amount; q = amount / unit; r = amount - q * unit; if (r < 0) { r += unit; q -= 1; } half = unit / 2; if (r > half || (r == half && (q & 1L))) q += 1; return q * unit; } /* 자릿수(log10) 규모로 5단계 분류 */ int lg_cu_0001_classify(long amount) { long v = amount < 0 ? -amount : amount; int digits = 0; while (v > 0) { digits++; v /= 10; } if (digits <= 3) return 0; if (digits <= 5) return 1; if (digits <= 7) return 2; if (digits <= 9) return 3; return 4; }