题目描述
第一代身份证十五位数升为第二代身份证十八位数的一般规则是:第一步,在原十五位数身份证的第六位数后面插入19;第二步,按照国家规定的统一公式计算出第十八位数,作为校验码放在第二代身份证的尾号。
校验码计算方法:将身份证前十七位数分别乘以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,这样就得出了第二代身份证第十八位数的校验码。
输入15位身份证号,对其升位,输出升位后的18位身份证号。
输入
测试次数T
每组测试数据为15位身份证号
输出
对每组测试数据,给出升位后的18位身份证号。
IO模式
本题IO模式为标准输入/输出(Standard IO),你需要从标准输入流中读入数据,并将答案输出至标准输出流中。

代码如下:
#include <stdio.h>
int main(){
char sfz1[20],sfz2[20];
int t,x;
int s[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char y[11]={'1','0','X','9','8','7','6','5','4','3','2'};
scanf("%d",&t);
getchar();
while(t--){
gets(sfz1);
x=0;
for(int i=0;i<6;i++)
sfz2[i]=sfz1[i];
sfz2[6]='1';
sfz2[7]='9';
for(int i=8;i<17;i++)
sfz2[i]=sfz1[i-2];
for(int i=0;i<17;i++)
x+=(sfz2[i]-'0')*s[i];
x=x%11;
sfz2[17]=y[x];
sfz2[18]='\0';
printf("%s",sfz2);
if(t)
printf("\n");
}
return 0;
}
sfz1代表第一代的号码,sfz2代表第二代的号码
s数组储存校验码计算的数,y储存x余数对应的最后一位数
s必须是整数类型,因为要进行计算,而y必须是字符类型,因为对应的最后一位数也是以字符类型存在和输出,如果y写成整数对应的就是编号为y的ASCII码表里的字符,就会导致一些奇怪的输出或者最后一位的缺失
要分享的大概就这些,如果有更好的方法欢迎交流!
如果有帮到你请点个赞吧!也可以关注我,以后会分享更多,谢谢!
(专栏里面还有更多题哦)
307

被折叠的 条评论
为什么被折叠?



