閱讀874 返回首頁    go iPhone_iPad_Mac_apple


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

  上一篇:go WIKIOI-1151 分數線劃定
  下一篇:go 百度地圖聚合