严晏来的博客

  • 关于我
  • 我的吉他作品
  • 我热爱的辩论
  • 我的技术博客
  • 我的软件作品
  • 我的小记
你好哇!欢迎来到我的博客!
在代码世界里摸爬滚打的菜鸟程序员一枚,喜欢搭系统、写代码,喜欢追寻各种技术,热爱生活,喜欢唱歌、弹吉他。
  1. 首页
  2. 我的技术博客
  3. 数据结构与算法
  4. 正文

数据结构与算法作业——用C++程序判断身份证真假

2022年9月1日 204点热度 0人点赞 0条评论

​

公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码,最后一位是数字校验码。

 

身份证最后一位是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。

具体计算过程如下:

1、将前面的身份证号码17位数分别乘以不同的系数。第i位对应的数为[2^(18-i)]mod11。

从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

2、将这17位数字和系数相乘的结果相加;

3、用加出来和除以11,看余数是多少;

4、余数只可能有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 2 3 4 5 6 7 8 9 10
1 0 X 9 8 7 6 5 4 3 2

 

C++代码实现如下:

思路:

1.先将身份证前17位用字符型数组进行存储即char a[17];

2.将上述1-17位每一位的权重储存在整型数组b[17]中;

3.将char a[17]这些字符型数据转化成整型数据方便进行后续运算。

值得注意的是,如果直接将字符型数据进行运算的话,使用的是其ASCLL码,由于0的ASCLL码为48,只需要将每个字符型数据减去‘0’即可将其转化成整型数据;

4.将身份证每位数与其对应的权重相乘并相加,得到sum。将sum除以11得到其余数mod;

5.由余数对应的校验码,可以得知身份证的第18位。

0 1 2 3 4 5 6 7 8 9 10
1 0 X 9 8 7 6 5 4 3 2

具体代码如下:

#include<iostream>
using namespace std;
int main()
{
	cout<<"请输入身份证号的前17位:";
	char a[17];
	for(int i=0;i<17;i++)
	{
		cin>>a[i];
	}
	cout<<"您输入的身份证号前17位为:";
		for(int j=0;j<17;j++)
	{
		cout<<a[j];
	}
	int b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	int multiple[17];
	int sum=0;
	int c[17];
	for (int n=0; n<17; n++)
	{
		c[n] = a[n] - '0';
	} 

	for(int k=0;k<17;k++)
	{
		multiple[k]=c[k]*b[k];
	}
	for(int m=0;m<17;m++)
	{
		sum+=multiple[m];
	}
	int mod=0;
	mod=sum%11;
	cout<<endl;
	if (mod==0)
	cout<<"您身份证的最后一位为1";
	else if(mod==1)
	cout<< "您身份证的最后一位为0";
		else if(mod==2)
	cout<< "您身份证的最后一位为X";
		else if(mod==3)
	cout<< "您身份证的最后一位为9";
		else if(mod==4)
	cout<< "您身份证的最后一位为8";
		else if(mod==5)
	cout<< "您身份证的最后一位为7";
		else if(mod==6)
	cout<< "您身份证的最后一位为6";
		else if(mod==7)
	cout<< "您身份证的最后一位为5";
		else if(mod==8)
	cout<< "您身份证的最后一位为4";
		else if(mod==9)
	cout<< "您身份证的最后一位为3";
		else if(mod==10)
	cout<< "您身份证的最后一位为2";
	return 0;
}

总结:

本代码主要运用了循环结构、选择结构。遇到的困难主要有字符型数据转整型数据。由于是数据结构与算法课,本程序还能用更加高效的代码来实现,后续还需要加以学习。

​

标签: 暂无
最后更新:2024年10月23日

YanYanlai

这个人很懒,什么都没留下

点赞

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2024 年 11 月
  • 2024 年 10 月
  • 2024 年 8 月
  • 2024 年 5 月
  • 2023 年 6 月
  • 2023 年 3 月
  • 2022 年 12 月
  • 2022 年 9 月

分类

  • leetcode刷题记录
  • linux
  • web开发
  • 导航与定位
  • 我的小记
  • 我的技术博客
  • 我的软件作品
  • 数据结构与算法
  • 赵雷
  • 面试八股

COPYRIGHT © 2024 严晏来的博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang