中国身份证号码校验

题目描述

第二届河南省最美教师评选开始了,每一位同学都可以投票选出你支持的人选,但是为了防止刷票,必须通过身份验证才可投票。负责投票平台后台的老大爷希望你能帮他验证身份证号的合法性,防止那些熊孩子随意刷票,下面给出验证规则: (身份证末尾的大写X表示罗马数字10) 采用了ISO 7064:1983.MOD 11-2校验码,以防止不小心记错某一位
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、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是X。

特别注意:
”Ⅹ“ 是 罗马数字 10, 不是 英文大写字母 ”X“, 此处为了编码方便,使用了英文字母 ‘X’ 代替;

现在将给你提供一组身份证号码,请判断哪些是合法的,哪些是不合法的。
输入格式
第一行一个整数n,表示给你提供的身份证号码总数
接下来n行每行18个字符,为一个身份证序列,保证字符满足为0~9和X(末尾的X一定为大写) (不保证省份证真实存在,不保证年月日满足要求,但是只需要判断身份证是否合法,不需要判断年份月份是否现实)
输出格式
对于每一行输入,给出一个输出,表示输入的身份证是否合法 如果合法,则输出"True",否则,输出"False"

样例

样例输入
1
53010219200508011X

样例输出
True

数据范围与提示

数据范围
n <= 500

样例解释

首先我们得出前17位的乘积和
( (57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2) )是189,
然后用189除余11得出结果189%11 == 2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。
所以,可以判定这是一个正确的身份证号码。

题解!!!!

#include<bits/stdc++.h>
using namespace std;
long long n,s,b[100]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
string a;
char c[100]={'1','0','X','9','8','7','6','5','4','3','2'},e;
int main()
{
	cin>>n;
	while(n--)
	{
		s=0;
		cin>>a;
		// 将前面的身份证号码17位数分别乘以不同的系数
		for(int i=0;i<17;i++)
		{
			s+=(a[i]-'0')*b[i];
		}
		s%=11;
		e=c[s];
		// 判断身份证最后一位是否与计算得到的校验码相同
		if(a[17]==e)
			cout<<"True";
		else
			cout<<"False";
		cout<<endl;
	}
	return 0;
}

该程序使用一个整型数组 b 存储了身份证号码每一位的系数,即 7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
然后通过循环,将每一位身份证号码与对应的系数相乘并累加到变量 s 上。
计算完后,将 s 取模 11,得到一个余数 s (余数范围为 0~10)。
然后通过余数 s 在字符数组 c 中找到对应的校验码 e
最后判断输入的身份证最后一位是否与计算得到的校验码 e 相同,如果相同输出 “True”,不相同输出 “False”。
程序中的 n 表示身份证号码的总数。
注意:在题目描述中,将罗马数字 10 用大写字母 X 表示,但在程序中使用的是英文字母 ‘X’。

点个赞吧,帅哥美女们,本人为小学生。

在Java中,对身份证号码进行校验通常会检查其结构是否符合规定的18位或15位数字规则,并通过算法验证其中包含的校验码。中国身份证号码有固定格式,前6位代表地区,接下来8位代表出生日期,倒数第2位是性别标识(奇数为男,偶数为女),最后一位是根据前面的信息计算出来的校验码。 常见的校验算法包括: 1. 第17位单向校验码:利用特定公式计算得到,根据奇偶性有不同的计算规则。 2. 第18位校验码:对于18位号码,有时会出现X代替0的情况,这是为了防止输入错误。校验时需要考虑这个特殊规则。 下面是一个简单的例子,展示如何使用正则表达式配合计算校验码: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class IDValidator { private static final String[] WEIGHTS = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; private static final Pattern ID_PATTERN = Pattern.compile("\\d{15}(\\d|X|x)?"); public static boolean isValid(String id) { Matcher matcher = ID_PATTERN.matcher(id); if (!matcher.matches()) return false; int sum = 0; for (int i = 0; i < 17; i++) { int digit = Character.getNumericValue(id.charAt(i)) * WEIGHTS[i]; sum += digit; } if (id.length() == 18 && id.charAt(17) != 'X') { int lastDigit = Character.getNumericValue(id.charAt(17)); return (sum % 11 == lastDigit); } else { return sum % 11 == 0; // 对于15位号码,直接除以11看余数是否为0 } } public static void main(String[] args) { System.out.println(isValid("123456789012345678")); // 输出:true 或 false } } ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值