趣味编程|判断身份证号码输入的合法性(不用正则)

发布时间:2024-09-16

Image

身份证号码看似简单,实则暗藏玄机。在中国,每个公民的身份证号码都是独一无二的,它不仅记录了个人的基本信息,还蕴含着一套精妙的数学验证机制。今天,让我们一起揭开身份证号码背后的数学奥秘,探索如何不使用正则表达式来验证身份证号码的合法性。

身份证号码由18位数字组成,其中前17位是本体码,最后一位是校验码。这个校验码是整个验证机制的核心,它根据ISO 7064:1983.MOD 11-2校验码计算标准生成。具体来说,校验码是通过将前17位数字分别乘以不同的权重系数,然后求和,最后用这个和除以11得到的余数来确定的。

让我们通过一个具体的例子来理解这个过程。假设有一个身份证号码:533223196301050917X。我们首先将前17位数字与对应的权重系数相乘:

5 * 7 + 3 * 9 + 3 * 10 + 2 * 5 + ... + 1 * 2 = 258

然后,我们将这个结果除以11,得到的余数是5。根据校验码的对应关系,余数5对应的校验码是7。因此,如果这个身份证号码是合法的,那么它的最后一位应该是7。但实际上,这个号码的最后一位是X,这似乎与我们的计算结果不符。

然而,这里有一个关键点需要注意:如果计算得到的余数是10,那么校验码应该是X。这是因为如果用10作为校验码,整个身份证号码就会变成19位,这违反了国家标准。因此,用X来代替10,既符合数学逻辑,又满足了国家标准的要求。

现在,让我们来看看如何用代码来实现这个验证过程。以下是一个简单的JavaScript函数,用于验证18位身份证号码的合法性:

function validateIdCard(idCard) {
  var idCardWi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 加权因子数组
  var idCardY = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // 校验码数组,10代表X

  var idCardWiSum = 0;
  for (var i = 0; i < 17; i++) {
    idCardWiSum += parseInt(idCard[i]) * idCardWi[i];
  }

  var idCardMod = idCardWiSum % 11;
  var idCardLast = idCard[17];

  if (idCardMod == 2 && (idCardLast == "X" || idCardLast == "x")) {
    return "身份证号码验证通过!";
  } else if (idCardLast == idCardY[idCardMod]) {
    return "身份证号码验证通过!";
  } else {
    return "您输入的身份证号码有误!";
  }
}

这个函数首先定义了加权因子数组和校验码数组。然后,它遍历身份证号码的前17位,计算加权和。接着,它用这个和除以11得到余数,并根据余数查找对应的校验码。最后,它将计算得到的校验码与身份证号码的实际最后一位进行比较,从而判断身份证号码是否合法。

这种方法不仅避免了使用复杂的正则表达式,而且通过数学运算直观地展示了身份证号码的验证逻辑。它不仅适用于身份证号码的验证,还能帮助我们更好地理解身份证号码的编码规则和设计原理。

身份证号码的验证机制体现了数学之美和实用性。通过简单的数学运算,我们就能确保每个身份证号码的唯一性和准确性。这种设计不仅提高了数据处理的效率,也为个人信息的安全提供了保障。下次当你输入身份证号码时,不妨想想这个看似简单的数字背后蕴含的数学智慧。