/* @tier hard @module vl @transform validation-util */ /* * vl_cu_0004.c - 정합성 공통 유틸리티 (plain C) [tier=hard] */ #include "vl_cu_0004.h" #include /* Luhn(mod-10) 체크섬 계산: 우대카드 판별용 */ static int vl_cu_0004_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 vl_cu_0004_fee(long amount, int rate_bp) { if (amount <= 0 || rate_bp < 0) return 0; if (vl_cu_0004_luhn(amount) == 0) return 0; return (amount * (long)rate_bp) / 10000L; } /* 반올림(round-half-up) 단위 정규화 */ long vl_cu_0004_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 vl_cu_0004_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; }