身份證最後一位的校驗

織田、信長發表於2020-12-08

身份證的最後一位數字(或者字母)是依賴於之前所有數字的。
根據前面17位數字,計算得到最後一個字元的過程,稱為身份證校驗演算法。
這個演算法的計算過程如下:

  • 將身份證號碼的前17位數字,與校驗權重表中對應的權重,分別相乘,並求和。
  • 將以上的求和結果,對11取餘,得到一個校驗表下標
  • 根據上一步得到的校驗表下標,得到身份證最後一位的符號

以上的演算法過程中,有兩個表,非常適合使用陣列儲存。

在這裡插入圖片描述

//權重表
int weightTable[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//校驗碼錶
char chCheckTable[11] = {‘1’, ‘0’, ‘X’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’,‘2’};

#include <stdio.h>



int main(void)
{
	int ID[17] = { 3,7,1,1,0,2,1,9,9,6,0,8,2,5,5,9,8};//身份證前17位
	int weightTable[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };//對應權重
	char chCheckTable[] = { '1','0','X','9','8','7','6','5','4','3','2' };//對應校驗碼
	/*
	將身份證號碼的前17位數字,與校驗權重表中對應的權重,相乘,並求和。
    將以上的求和結果,對11取餘,得到一個校驗表下標
    根據上一步得到的校驗表下標,得到身份證最後一位的符號
	
	*/
	int sum = 0;//定義一個int型別的sum來存放權重相乘之和
	for (size_t i = 0; i < sizeof(ID)/sizeof(ID[0]); i++)
	{
		sum += ID[i] * weightTable[i];
		
	}
	printf("和取餘是%d\n",sum % 11);
	printf("校驗碼為%c\n",chCheckTable[sum%11]);
	return 0;
}

相關文章