/*
假设某一17位数字是
17位数字 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
加权因子 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
计算17位数字各位数字与对应的加权因子的乘积的和S:1×7+2×9+3×10+4×5+5×8+6×4+7×2+8×1+9×6+0×3+1×7+2×9+3×10+4×5+5×8+6×4+7×2=368;
计算S÷11的余数T:368 mod 11=5;
(( 余数0-10对应校验码为[1, 0, X , 9, 8, 7, 6, 5, 4, 3, 2],算法如下 ))
计算(12-T)÷11的余数R,如果R=10,校验码为罗马数字 10(Ⅹ)“X”;如果R≠10,校验码为数字“R”:(12-5)mod 11=7。
该17位数字的校验码就是7,聚合在一为123456789012345677。
*/
#include <stdio.h>
#include <string.h> int main(void)
{
char InNum[18];
char CheckNum[11] = {'1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'};
int i = 0;
int Sum = 0; memset(InNum, 0, 18);
printf("\n请输入身份证前17位数字,按回车键结束:\n\t");
fflush(stdin);
scanf("%s",InNum); printf("\n输入的前17位数字为: \n\t");
for(i = 0;i < 17;i++)
{
// 将ASCII码值 转化为数字
InNum[i] -= 0x30;
printf("%d",InNum[i]);
} Sum = InNum[0]*7 + InNum[1]*9 + InNum[2]*10 + InNum[3]*5 + InNum[4]*8 +InNum[5]*4 + InNum[6]*2 + InNum[7]*1 + InNum[8]*6
+ InNum[9]*3 + InNum[10]*7 + InNum[11]*9 + InNum[12]*10 + InNum[13]*5 + InNum[14]*8 + InNum[15]*4 + InNum[16]*2; printf("\n生成的身份证号码为: \n\t");
for(i = 0;i < 17;i++)
printf("%d",InNum[i]);
printf("%c", CheckNum[Sum % 11]);
printf("\nOK\n");
return 0;
}

参考 : http://blog.csdn.net/n289950578/article/details/22287389

特别注意:

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

罗马数字1到10的写法:I
,II ,III, IV ,V ,VI, VII ,VIII ,IX, X

罗马数字输入参考》》》  罗马数字1到10怎么打_百度经验

05-12 16:08