SZU实验九数组3函数1【id:429】【15分】B. 身份证升位(字符串)

题目描述

第一代身份证十五位数升为第二代身份证十八位数的一般规则是:第一步,在原十五位数身份证的第六位数后面插入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码表里的字符,就会导致一些奇怪的输出或者最后一位的缺失

要分享的大概就这些,如果有更好的方法欢迎交流!

如果有帮到你请点个赞吧!也可以关注我,以后会分享更多,谢谢!

(专栏里面还有更多题哦)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值