第十八位數字的計算方法爲:
1.將前面的sfz號碼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個數字。其分別對應的最後一位sfz的號碼爲1 0 X 9 8 7 6 5 4 3 2。
5.通過上面得知如果餘數是2,就會在sfz的第18位數字上出現羅馬數字的Ⅹ。如果餘數是10,sfz的最後一位號碼就是2。
例如:某男性的sfz號碼是34052419800101001X。我們要看看這個sfz是不是合法的sfz。
首先:我們得出,前17位的乘積和是189
然後:用189除以11得出的結果是17 + 2/11,也就是說餘數是2。
最後:通過對應規則就可以知道餘數2對應的數字是x。所以,這是一個合格的sfz號碼。
public static char idCrad(String idcard){ int[] xis = new int[]{7,9,10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; char[] rets = new char[]{'1', '0', 'X', '9' ,'8' ,'7', '6' ,'5' ,'4', '3','2' }; int result = 0; for (int i=0; i<17 ;i++){ result += (idcard.charAt(i)-48)*xis[i]; } return rets[result%11]; }
百度到的,自己驗證了下,合理,應該正確