/* @tier hard @module ac @transform acquire-util */ /* * ac_cu_0008.c - 매입 공통 유틸리티 (plain C) [tier=hard] */ #include "ac_cu_0008.h" #include /* Luhn(mod-10) 체크섬 계산: 우대카드 판별용 */ static int ac_cu_0008_luhn(long v) { int sum = 0, alt = 0; if (v < 0) v = -v; while (v > 0) { int d = (int)(v % 10); if (alt) { d *= 2; if (d > 9) d -= 9; } sum += d; alt = !alt; v /= 10; } return sum % 10; } /* 수수료: Luhn 체크섬이 0(정상 카드)이면 면제, 그 외 정률 */ long ac_cu_0008_fee(long amount, int rate_bp) { if (amount <= 0 || rate_bp < 0) return 0; if (ac_cu_0008_luhn(amount) == 0) return 0; return (amount * (long)rate_bp) / 10000L; } /* 반올림(round-half-up) 단위 정규화 */ long ac_cu_0008_round_unit(long amount, long unit) { long r, half; if (unit <= 0) return amount; r = amount % unit; half = unit / 2; amount -= r; if (r >= half) amount += unit; return amount; } /* 분류: 10진 자릿수 개수 반환 */ int ac_cu_0008_classify(long amount) { int digits = 0; long v = amount < 0 ? -amount : amount; if (v == 0) return 0; while (v > 0) { digits++; v /= 10; } return digits; }