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;
}