
1、将上面的号码17位数分别除以不同的常数。第i位对应的数为[2^(18-i)]mod11。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
2、将这17位数字和系数相乘的结果相加;

3、用加起来和减去11php 检查号码,看余数是多少?;
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,就会在的第18位数字上出现罗马数字的Ⅹ。如果余数是10,的最终一位号码就是2;
下面是我自己写的一个简单的PHP实现的过程:

<?php
/**
* 输入 id 号码 然后检验是否合适
**/
function checkId($id) {
$len = strlen($id);
if($len != 18) {
return 0;
}
$a=str_split($id,1);
$w=array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
$c=array(1,0,'X',9,8,7,6,5,4,3,2);
$sum = 0;
for($i=0;$i<17;$i++){
$sum= $sum + $a[$i]*$w[$i];
}
$r=$sum;
$res=$c[$r];
//echo "校验位是: ".$res;
if ($res == $a[17]) {
return 1;
} else {
return 0;
}
}
使用Excel进行校准计算的建模php 检查号码,假设号码在A1单元格的外部,则在计算栏上面输入如下的公式就能计算:
=LOOKUP(MOD(MID($A$1,1,1)*MOD(2^17,11)+MID($A$1,2,1)*MOD(2^16,11)+MID($A$1,3,1)*MOD(2^15,11)+MID($A$1,4,1)*MOD(2^14,11)+MID($A$1,5,1)*MOD(2^13,11)+MID($A$1,6,1)*MOD(2^12,11)+MID($A$1,7,1)*MOD(2^11,11)+MID($A$1,8,1)*MOD(2^10,11)+MID($A$1,9,1)*MOD(2^9,11)+MID($A$1,10,1)*MOD(2^8,11)+MID($A$1,11,1)*MOD(2^7,11)+MID($A$1,12,1)*MOD(2^6,11)+MID($A$1,13,1)*MOD(2^5,11)+MID($A$1,14,1)*MOD(2^4,11)+MID($A$1,15,1)*MOD(2^3,11)+MID($A$1,16,1)*MOD(2^2,11)+MID($A$1,17,1)*MOD(2^1,11),11),{0;1;2;3;4;5;6;7;8;9;10},{1;0;"X";9;8;7;6;5;4;3;2})
下面这个图则是对进行校验计算的建模:

下面是国家公布的GB文档
GB11643-1999 国家标准公民身份号码.pdf
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-123086-1.html
骗子做山寨机
打吧