2012藍橋杯【初賽試題】身份證
題目描述:
如果讓你設計個程序,用什麼變量保存身份證號碼呢?長整數可以嗎?不可以!
因為有人的身份證最後一位是"X"
實際上,除了最後一位的X,不會出現其它字母!
身份證號碼18位 = 17位 + 校驗碼
校驗碼的計算過程:
例如:身份證前17位 = ABCDEFGHIJKLMNOPQ
A~Q 每位數字乘以權值求和(每位數字和它對應的“權”相乘後累加)
17位對應的權值分別是:
7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
求出的總和再對11求模
然後按下表映射:
餘數 0 1 2 3 4 5 6 7 8 9 10
校驗碼: 1 0 X 9 8 7 6 5 4 3 2
下麵的代碼實現了校驗過程,輸入串為身份證前17位,打印出校驗碼。
char verifyCode(char* s)
{
static int weight[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
static char map[] = {'1','0','X','9','8','7','6','5','4','3','2'};
int sum = 0;
for(int i=0; i<17; i++)
{
sum += (_________) * weight[i]; // 填空
}
return map[__________]; // 填空
}
答案:
s[i]-'0'
sum%11
要注意字符要轉換成數字才能進行計算
完整代碼:
#include<stdio.h> #include<string.h> #include<stdlib.h> char s[20]; char verifyCode(char* s) { static int weight[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; static char map[] = {'1','0','X','9','8','7','6','5','4','3','2'}; int sum = 0; for(int i=0; i<17; i++) { sum += (s[i]-'0') * weight[i]; // 填空 } return map[sum%11]; // 填空 } int main() { int m; printf("請輸入身份證前17位:\n"); scanf("%s",s); m=verifyCode(s); printf("您的18位身份證號碼為:%s%d\n",s,m); system("pause"); return 0; }
最後更新:2017-04-03 12:55:19