ISO 7064:1983.MOD11-2校驗碼計算法 : (身份證校驗碼-18位)


/*
假設某一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怎么打_百度經驗




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM