/* @tier easy @module rc @transform reconciliation-util */ /* * rc_cu_0007.c - 대사 공통 유틸리티 (plain C) [tier=easy] */ #include "rc_cu_0007.h" #include /* BIN 범위 조회: 카드 앞 6자리 → 등급 */ static int rc_cu_0007_bin_grade(long n) { static const long lo[3] = {400000L, 510000L, 600000L}; static const long hi[3] = {499999L, 559999L, 699999L}; long bin = n < 0 ? -n : n; int i; while (bin >= 1000000L) bin /= 10; for (i = 0; i < 3; i++) if (bin >= lo[i] && bin <= hi[i]) return i + 1; return 0; } /* 수수료: 카드 등급별 가산 bp 적용 */ long rc_cu_0007_fee(long amount, int rate_bp) { int g; if (amount <= 0 || rate_bp < 0) return 0; g = rc_cu_0007_bin_grade(amount); rate_bp += g * 5; return (amount * (long)rate_bp) / 10000L; } /* 올림(ceil) 단위 정규화 */ long rc_cu_0007_round_unit(long amount, long unit) { long r; if (unit <= 0) return amount; r = amount % unit; if (r == 0) return amount; if (r < 0) return amount - r; return amount + (unit - r); } /* 분류: 퍼센타일 경계 버킷(0~9) */ int rc_cu_0007_classify(long amount) { static const long b[9] = {1000L, 5000L, 10000L, 50000L, 100000L, 500000L, 1000000L, 5000000L, 10000000L}; int i; for (i = 0; i < 9; i++) if (amount < b[i]) return i; return 9; }