据我观察,身份证号是有规律的。同一城镇同学的身份证号前6位基本都一样,接下来8位显然是出生日期,最后4位数像是序号,那岂不在个人身份证号基础上随便改几个数字就能化身他人?且慢!有些同学身份证号最后一位居然是X,没想象的那么简单……
任务:编写函数验证身份号码是否有效。具体要求:
- 遵循:GB11643-1999《公民身份号码》国家标准。
- 公民身份号码由十七位位数字本体码(master number)和一位数字校验码(check number)组成。
- 从左到
据我观察,身份证号是有规律的。同一城镇同学的身份证号前6位基本都一样,接下来8位显然是出生日期,最后4位数像是序号,那岂不在个人身份证号基础上随便改几个数字就能化身他人?且慢!有些同学身份证号最后一位居然是X,没想象的那么简单……
任务:编写函数验证身份号码是否有效。具体要求:
- 遵循:GB11643-1999《公民身份号码》国家标准。
- 公民身份号码由十七位位数字本体码(master number)和一位数字校验码(check number)组成。
- 从左到右依次为:六位地址码、八位日期码、三位顺序码、一位校验码。
- 地址码:本题中无需检查。
- 日期码:应为**有效的日期**,考虑闰年。
- 顺序码:同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号。**奇数分配给男性、偶数分配给女性**。
- 校验码:对本体码的17位数字、分别乘以权值[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]并累加。
- 权值可以用数组保存,用循环处理。不要写17行……
- 将累加结果除以11,则余数可能为0, 1, ..., 10,对应校验码[1,0,X,9,8,7,6,5,4,3,2],即身份号码的末位。
- 校验码可以用数组保存,更好的办法是写成字符串(C++的原生字符串就是字符数组),用余数做下标索引。不要写10个if或case……
**建议设计为bool is_id_number(const string &s);形式的函数。**
#### 输入规格
每行一个字符串,整行读入并处理,直到EOF为止。
#### 输出规格
对每行输入,输出一行校验结果。
- 有效请输出xxx: YYYY-MM-DD M/F,身份号码对应男士输出M、女士输出F。
- 无效则输出xxx: invalid
- 其中xxx请换成输入的字符串。
#### 样例输入
in
11010519491231002X
440524188001010019
#### 样例输出
out
11010519491231002X: 1949-12-31 F
440524188001010019: invalid
#### 样例解释
- 第1行:S = 1*7 + 1*9 + 0*10 + 1*5 + 0*8 + 5*4 + 1*2 + 9*1 + 4*6 + 9*3 + 1*7 + 2*9 + 3*10 + 1*5 + 0*8 + 0*4 + 2*2 = 167
- 167 mod 11 = 2,余数2对应的校验码是X,因此该身份号码有效,是出生于1949年12月31日的一位女性。
- 第2行:S = 4*7 + 4*9 + 0*10 + 5*5 + 2*8 + 4*4 + 1*2 + 8*1 + 8*6 + 0*3 + 0*7 + 1*9 + 0*10 + 1*5 + 0*8 + 0*4 + 1*2 = 195
- 195 mod 11 = 8,余数8对应的校验码是4,而该身份号码末尾是9,不符,无效。
答案:若无答案欢迎评论
任务:编写函数验证身份号码是否有效。具体要求:
- 遵循:GB11643-1999《公民身份号码》国家标准。
- 公民身份号码由十七位位数字本体码(master number)和一位数字校验码(check number)组成。
- 从左到右依次为:六位地址码、八位日期码、三位顺序码、一位校验码。
- 地址码:本题中无需检查。
- 日期码:应为**有效的日期**,考虑闰年。
- 顺序码:同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号。**奇数分配给男性、偶数分配给女性**。
- 校验码:对本体码的17位数字、分别乘以权值[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]并累加。
- 权值可以用数组保存,用循环处理。不要写17行……
- 将累加结果除以11,则余数可能为0, 1, ..., 10,对应校验码[1,0,X,9,8,7,6,5,4,3,2],即身份号码的末位。
- 校验码可以用数组保存,更好的办法是写成字符串(C++的原生字符串就是字符数组),用余数做下标索引。不要写10个if或case……
**建议设计为bool is_id_number(const string &s);形式的函数。**
#### 输入规格
每行一个字符串,整行读入并处理,直到EOF为止。
#### 输出规格
对每行输入,输出一行校验结果。
- 有效请输出xxx: YYYY-MM-DD M/F,身份号码对应男士输出M、女士输出F。
- 无效则输出xxx: invalid
- 其中xxx请换成输入的字符串。
#### 样例输入
in
11010519491231002X
440524188001010019
#### 样例输出
out
11010519491231002X: 1949-12-31 F
440524188001010019: invalid
#### 样例解释
- 第1行:S = 1*7 + 1*9 + 0*10 + 1*5 + 0*8 + 5*4 + 1*2 + 9*1 + 4*6 + 9*3 + 1*7 + 2*9 + 3*10 + 1*5 + 0*8 + 0*4 + 2*2 = 167
- 167 mod 11 = 2,余数2对应的校验码是X,因此该身份号码有效,是出生于1949年12月31日的一位女性。
- 第2行:S = 4*7 + 4*9 + 0*10 + 5*5 + 2*8 + 4*4 + 1*2 + 8*1 + 8*6 + 0*3 + 0*7 + 1*9 + 0*10 + 1*5 + 0*8 + 0*4 + 1*2 = 195
- 195 mod 11 = 8,余数8对应的校验码是4,而该身份号码末尾是9,不符,无效。
答案:若无答案欢迎评论