1272 - 身份证号码(number)

通过次数

85

提交次数

271

时间限制 : 1 秒
内存限制 : 128 MB

临近毕业,明明收集了班上同学的身份证号码,但有些同学的身份证号码可能填写错误,明明需要根据身份证号码的组合规则初步验证身份证号码是否填写正确。

身份证号码的组合规则:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码。校验码是通过精密的计算公式对前面十七位数字码进行计算得出来的。

身份证校验码计算方法:

1)将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

2)将这17位数字和系数相乘的结果相加;

3)用加出来的和除以11,看余数是多少;

4)余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;

5)通过上面得知如果余数是2,余数所对应的最后一位身份证号是X,就会在身份证的第18位数字上出现罗马数字的X。

例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。 首先:我们计算,前17位的乘积和是189. 然后:用189除以11得出的结果是商17余2 最后:通过对应规则就可以知道余数2对应的数字是X。所以,这是一个合格的身份证号码。 此外,身份证中间表示出生日期的八位数字也得符合日期制定规则,同学们的出生年份规定在1980年1月1日至2007年1月1日之间。同样的,月和日也需符合日期的制定规则。比如:某同学填写的八位数字出生日期码为20010229就视为错误日期,因为2001年为平年,这一年的2月不能有29天。

现在明明收集了个身份证号码,请你帮明明判断这些身份证号码是否正确,然后输出对应的提示信息。输出的提示信息要求如下: 根据验证结果,输出情况有以下5种:

1)当年份在1980年至2006年间,则认为年份是正确的;否则是错的,输出Y。

2)在年份正确的情况下,检查月份值。当月份在01至12之间,则认为月份是对;否则月份错,则输出M。

3)当年份和月份都是正确的时,检查日期值。日期需要根据前面的年份值和月份值来判断。如果日期值错误,则输出D。

4)当年份、月份、日期均正确的情况下,检查校验码。若校验码错误,则视为明明填写的身份证号码只有校验码错误,你需输出正确的身份证号码。

5)若验证后身份证号码正确,则输出T。

输入

输入第一行,包含一个正整数n,表示明明收集到身份证号码的数量。 接下来的n行,每行一个字符串s_i,表示输入的第i个身份证号码。

输出

输出共n行,每行表示对应输入的身份证号码应该给出的提示信息。

样例

输入

1
34052419800101001X

输出

T

输入

2
532101200002301134
532101200002291134

输出

D
532101200002291133

提示

【样例1解释】

输入1个身份证号码进行判断。 第一个身份证号码年份为1980年,在1980年1月1日至2007年1月1日之间(不包含2007年1月1日),故年份正确;月份为1月,正确;日期为1号,正确;按规则计算后校验码也正确。故第一行输出T.

【样例2解释】

输入2个身份证号码进行查询。

第一个身份证号码年份为2000年,在1980年1月1日至2007年1月1日之间(不包含2007年1月1日),故年份正确;月份为2月,正确;日期为30号,不正确。故第一行输D.

第二个身份证号码年份为2000年,在1980年1月1日至2007年1月1日之间(不包含2007年1月1日),故年份正确;月份为2月,正确;日期为29号,正确;按规则

来源

云南编程挑战赛