1. 程式人生 > >C程式-藍橋-身份證號碼升級

C程式-藍橋-身份證號碼升級

問題描述

  從1999年10月1日開始,公民身份證號碼由15位數字增至18位。(18位身份證號碼簡介)。升級方法為:
  1、把15位身份證號碼中的年份由2位(7,8位)改為四位。
  2、最後新增一位驗證碼。驗證碼的計算方案:
  將前 17 位分別乘以對應係數 (7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2) 並相加,然後除以 11 取餘數,0-10 分別對應 1 0 x 9 8 7 6 5 4 3 2。
  請編寫一個程式,使用者輸入15位身份證號碼,程式生成18位身份證號碼。假設所有要升級的身份證的四位年份都是19××年

輸入格式

  一個15位的數字串,作為身份證號碼

輸出格式

  一個18位的字串,作為升級後的身份證號碼

樣例輸入

110105491231002

樣例輸出

11010519491231002x

資料規模和約定

  不用判斷輸入的15位字串是否合理

 

#include <stdio.h>

int main( ) 
{
    int num[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//前 17 位分別對應係數
    char num1[12]="10x98765432";//除以 11 取餘數,0-10 分別對應 1 0 x 9 8 7 6 5 4 3 2。
    int sum=0;
    char str[20];//接收身份證字串 
    scanf("%s",str);
    
    for(int i=17;i>5;i--)//迴圈後移,第七第八位加入年份改為四位 
    {
        if(i==7)
            str[i]='9';
        else if(i==6)
            str[i]='1';    
        else str[i]=str[i-2];    
    }
        
    for(int i=0;i<17;i++)//將前 17 位分別乘以對應係數 並相加
    {
        sum=sum+(str[i]-'0')*num[i];
    }

    str[17]=num1[sum%11];// 第十八位,除以 11 取餘數 
    str[18]='\0';//末尾加入字串結束標誌‘\0’ 
    
    printf("%s",str);
//    printf("%d %s",sum%11,num1);
    return 0;
}