站外题求助 悬赏一关
  • 板块学术版
  • 楼主sakura_erii
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/8/25 09:37
  • 上次更新2023/11/3 01:22:27
查看原帖
站外题求助 悬赏一关
677147
sakura_erii楼主2023/8/25 09:37

居民身份证号码,正确、正式的称谓应该是“公民身份号码”。中华人民共和国居民身份证是国家法定的证明公民个人身份的有效证件。公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0~9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且中国的计算机应用系统也不承认19位的身份证号码。X是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。

校验码计算方法如下: 将身份证号码的前17位数分别乘以不同的系数。从第1位到第17位的系数依次为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2; 将这17位数字和系数相乘的结果相加。用加起来的和除以11,看余数是多少? 余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字。其分别对应的最后一位身份证的号码为1、0、X 、9、8、7、6、5、4、3、2(即余数0对应1,余数1对应0,余数2对应X...),这就是身份证的校验码。 题目描述 办案人员发现纸张上写有一个身份证号码,但是身份证号码有一位被污迹遮盖无法识别,请你编写程序帮忙还原这个身份证号码。

输入格式 1 1 行,一个 18 18 位的身份证号码,被污迹遮盖的那一位输入时用 ? 代替。

输出格式 还原后的身份证号码。

#include<bits/stdc++.h>
using namespace std;
int change(string a)
{
	int s=1;
	for(int i=0;i<a.size();i++)
	{
		if(i==0&&a[i]!='?') s=s+7*(a[i]-'0');
		if(i==1&&a[i]!='?') s=s+9*(a[i]-'0');
		if(i==2&&a[i]!='?') s=s+10*(a[i]-'0');
		if(i==3&&a[i]!='?') s=s+5*(a[i]-'0');
		if(i==4&&a[i]!='?') s=s+8*(a[i]-'0');
		if(i==5&&a[i]!='?') s=s+4*(a[i]-'0');
		if(i==6&&a[i]!='?') s=s+2*(a[i]-'0');
		if(i==7&&a[i]!='?') s=s+1*(a[i]-'0');
		if(i==8&&a[i]!='?') s=s+6*(a[i]-'0');
		if(i==9&&a[i]!='?') s=s+3*(a[i]-'0');
		if(i==10&&a[i]!='?') s=s+7*(a[i]-'0');
		if(i==11&&a[i]!='?') s=s+9*(a[i]-'0');
		if(i==12&&a[i]!='?') s=s+10*(a[i]-'0');
		if(i==13&&a[i]!='?') s=s+5*(a[i]-'0');
		if(i==14&&a[i]!='?') s=s+8*(a[i]-'0');
		if(i==15&&a[i]!='?') s=s+4*(a[i]-'0');
		if(i==16&&a[i]!='?') s=s+2*(a[i]-'0');
	}
	return s-1;
}
char ec(char s)
{
	if(s=='0') return '1';
	if(s=='1') return '0';
	if(s=='2') return 'X';
	if(s=='3') return '9';
	if(s=='4') return '8';
	if(s=='5') return '7';
	if(s=='6') return '6';
	if(s=='7') return '5';
	if(s=='8') return '4';
	if(s=='9') return '3';
}
int main()
{
	string a;
	cin>>a;
	if(a[a.size()-1]=='?')
	{
		int k=change(a)%11;	
		if(k==10) a[a.size()-1]='2';
		else a[a.size()-1]=ec(char(k));
	}
	else 
	{
		int l=change(a);
		cout<<l<<endl;
		int ji=l%11;
		cout<<ji<<endl;
		int w=ec(a[a.size()-1])-'0';
		if(a[a.size()-1]=='X') w=2;
		int kun=(11+w)-ji;
		cout<<kun<<endl;
		for(int i=0;i<a.size();i++)
		{
			if(a[i]=='?') a[i]=kun+'0';
		}
		
	}
	cout<<a; 
	return 0;
}
2023/8/25 09:37
加载中...