4173 - 银行卡

题目描述

某银行发行了一种 18 位长度的银行卡号,其编码规则如下:

  1. 6 位(第 16 位)为发卡行识别码,用于标识发卡机构。
  2. 714 位为账户开立日期,格式为 YYYYMMDD,例如 20250510 表示 2025510 日。
  3. 1517 位为账户序号,用于区分同一天在同一发卡行开立的多个账户。其中第 17 位为奇数表示该账户为对公账户,偶数表示个人账户。
  4. 18 位为校验位,其值可为数字 0-9 或大写字母 XX 代表数值 10)。银行采用 ISO 7064:1983 MOD 11-2 校验算法,当且仅当下列等式成立时校验通过:

    \left( \sum_{i=1}^{18} a_i \times 2^{18-i} \right) \bmod 11 = 1

    即:(a_1 \times 2^{18-1} + a_2 \times 2^{18-2} + \cdots + a_{18} \times 2^{18-18}) \bmod 11=1

    其中 a_i 表示卡号第 i 位字符对应的数值(第 1 位为最高位,第 18 位为校验位),X 对应数值 10

除校验位验证外,系统还要求开立日期必须为合法存在的日期,且介于 190011 日至 2025510 日之间(包含端点)。日期合法性需考虑闰年:能被 4 整除但不能被 100 整除的年份为闰年,能被 400 整除的年份也为闰年(例如 2000 年是闰年,1900 年不是)。闰年 2 月有 29 天,平年 2 月有 28 天。

输入

第一行一个整数 T,表示待校验的卡号数量。
接下来 T 行,每行一个长度为 18 的字符串(前 17 个字符保证为数字,第 18 个字符为数字或大写字母 X),表示一个待校验的银行卡号。

输出

对于每个卡号,输出一行:若所有校验条件均通过,则输出 PASS,否则输出 FAIL。输出均为大写字母。

样例

输入

2
14021320141203937X
140213201412039372

输出

PASS
FAIL

输入

5
11260019811223188X
13303720061018861X
13539819111030170X
122801192101033134
126648196812304507

输出

PASS
FAIL
FAIL
PASS
PASS
说明

样例说明

  • 第一个卡号 14021320141203937X
    6140213 为发卡行识别码。
    71420141203 表示开立日期为 2014123 日,该日期在 190011 日至 2025510 日之间且合法(2014 年不是闰年,12 月有 31 天,3 日存在)。
    1517937,第 17 位为 7(奇数),对应对公账户。
    校验计算:将第 18X 视为 10,代入公式得到余数为 1,校验通过。
    因此输出 PASS

  • 第二个卡号 140213201412039372
    17 位与上一个卡号完全相同,但第 18 位为数字 2。代入校验公式计算,余数不为 1,校验失败。
    因此输出 FAIL

数据范围

  • 对于 30\% 的数据,卡号中的日期部分保证是 190011 日至 2025510 日之间的合法日期。
  • 对于 100\% 的数据,T \leq 10,000
标签
题目参数
时间限制 1 秒
内存限制 512 MB
提交次数 0
通过人数 0
金币数量 4 枚
难度 基础


上一题 下一题