身份证号码编排规则

本文详细介绍了如何使用Python编写代码来验证身份证号码的结构和校验码计算方法,包括18位数字的含义、校验码的生成规则,并提供了示例代码进行操作演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、身份证号码是由18位数字组成,分别表示:

 (1)第1、2位数字表示:所在省份的代码

 (2)第3、4位数字表示:所在城市的代码

 (3)第5、6位数字表示:所在区县的代码

 (4)第7-14位数字表示:出生年、月、日(其中7、8、9、10位是年,11、12位是月,13、14位是日)

 (5)第15-17位都是同一地址辖区内的,以及同年同月同日出生人的顺序码,同时第17位兼具性别标识功能,男单女双

 (6)第18位数字是校验码:可以是0-9的数字,有时也用X表示。

  

二、校验码:

1、将前面的身份证号码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

5、通过上面得知如果余数是2,余数所对应的最后一位身份证号是X,就会在身份证的第18位数字上出现罗马数字的X。

例如:某男性的身份证号码是34 05 2419800101 001X。我们要看看这个身份证是不是合法的身份证。
首先:我们计算3*7+4*9+0*10+5*5+.. +1*2,前17位的乘积和是189
然后:用189除以11得出的结果是商17余2
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。
 

三、相关验证代码

import time
def check_id_length(n):
    if len(str(n)) != 18:
        print("只支持18位身份证号查询")
        return False
    else:
        return True

def check_id_data(n):
    n = str(n)
    n2 = str(n[:16])
    time_now = int(time.strftime("%Y",time.localtime()))
    is_digit = (not(n2.isdigit())) or (not(n[17].isdigit()) and (n[17]) !="x")
    if (is_digit):
        print("对不起,您这是火星身份证,暂不受理")
    elif (int(n[6:10]))>time_now:
            print(n[6:10],"年的人?您是穿越回来吗?")
    elif (int(n[10:12]))>12:
        print(n[10:12],"月出生?,您是捡来的吧!!")
    elif (int(n[12:14]))>31:
        print(n[12:14],"日出生?,您一定是充话费送的")
    else:
        check_id_data2(n)
def check_id_data2(n):
        var=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
        var_id=['1','0','x','9','8','7','6','5','4','3','2']
        sum = 0
        if int(n[16])%2==0:
            gender="女"
            same=int(int(n[16])/2)
        else:
            gender="男"
            same=int((int(n[16])+1)/2)
        for i in range(0,17):
            sum += int(n[i])*var[i]
        sum %= 11
        if (var_id[sum])==str(n[17]):
            print("身份证号规则核验通过,校验码是:",var_id[sum])
            print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
            return sum
        else:
            print("出生于:",n[6:10],"年",n[10:12],"月",n[12:14],"日","性别:",gender,"\n当地同性别同生日排名:",same)
            print("但身份证号规则核验失败,校验码应为",var_id[sum],",当前校验码是:",n[17])
            return 0
while(1):
    print("\n菜单,请输入数字\n----------------------")
    print("输入1手动输入身份证号")
    print("输入2选择测试号")
    print("不然就拜拜")
    print("----------------------")
    select = input("\n请输入:")
    if (select.isdigit()):
        pass
    else:
        print("说好的输入数字的呢,拜拜了您嘞")
        break
    select = int(select)
    if (select == 1):
        n = input("请输入18位身份证号:")
        if check_id_length(n):
            check_id_data(n)
        else:
            print("请重新输入")
    elif select == 2:
                 print("\n----------------------")
                 print("开始校验身份证号:61011519920317602")
                 check_id_length(61011519920317602)
                 print("\n----------------------")
                 print("开始校验身份证号:610115199203176021")
                 check_id_data(610115199203176021)
                 print("\n----------------------")
                 print("开始校验身份证号:610115199203176028")
                 check_id_data(610115199203176028)
    else:
                 break

原文链接:使用 python 进行身份证号校验_使用python制作一个程序 1、制作一个可以输入一个身份证号码的输入框。 2、输入如“431202-CSDN博客

在C语言中生成正确的中国居民身份证号码涉及到复杂的数据结构、算法以及校验规则身份证号码由18位数字组成,分为前6位的地区码、接下来8位的出生日期码、7位顺序码(奇数分配给男性,偶数分配给女性),最后一位是校验码。为了生成一个有效的身份证,你需要: 1. 确定地区编码(根据省市自治区编码规则) 2. 设置出生日期,注意月份范围(1-12)和日期(1-31) 3. 根据性别计算顺序码(男单女双) 4. 计算校验码,通常采用刘辉算法(也叫11位校验码算法) 以下是简化版的步骤示例,实际应用中需要更严谨的处理: ```c #include <stdio.h> #include <stdlib.h> // 模拟地区编码,实际情况更复杂 int get_area_code(int province, int city) { // 这里仅做示意,需要实际查找表或者函数 return province * 100 + city; } // 假设我们有固定的生日和性别数据 void set_date_and_gender(int* id, int birth_year, int birth_month, int birth_day, char gender) { *id = get_area_code(province, city); // 地区码 *id += birth_year * 10000 + birth_month * 100 + birth_day; // 出生日期码 if (gender == 'M') { (*id)++; // 顺序码奇数给男性 } else { (*id) *= 2; // 顺序码偶数给女性 if ((*id) > 999999) (*id) %= 11; // 避免溢出后校验码错误 } } // 刘辉算法校验码计算 char calculate_check_digit(int id) { int sum = 0; for (int i = 17; i >= 7; i--) { sum += ((i % 2 == 0) ? id : id / 10) * (i % 5 + 1); } if (sum % 11 == 0) return '1'; return (char)(11 - sum % 11); } int main() { int id; set_date_and_gender(&id, 1990, 1, 1, 'F'); // 示例,1990年1月1日出生,女性 id += calculate_check_digit(id); // 添加校验码 printf("Generated ID: %d\n", id); return 0; } ``` 请注意,此代码仅为演示,并未完全考虑所有细节,如闰年的处理和校验码计算的完整逻辑。在实际应用中,应当参考官方文档或现成库来保证准确性和合规性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值