第十八位数字的计算方法为:
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];
    }


百度到的,自己验证了下,合理,应该正确

http://zhidao.baidu.com/link?url=H3JuVgMoqMroCqZYJkZbSRgpX8F-hgqK0j3Q27If0CIKta6NRX64UkWt-iqVu3JRhxDQZ8ZdjIlEfHZu9NTcwq