• PAT 1031 查验身份证(15)(C++&Python)


    1031 查验身份证(15)(15 分)

    一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

    首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

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

    现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

    输入格式:

    输入第一行给出正整数N(<= 100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

    输出格式:

    按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出“All passed”。

    输入样例1:

    4
    320124198808240056
    12010X198901011234
    110108196711301866
    37070419881216001X

    输出样例1:

    12010X198901011234
    110108196711301866
    37070419881216001X

    输入样例2:

    2
    320124198808240056
    110108196711301862

    输出样例2:

    All passed

    C++: 

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
    	int n, sum, flag ;
    	cin >> n;
    	string s;
    	int a[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
    	int num = 0;
    	char c[11] = { '1','0','X','9','8','7','6','5','4','3','2' };
    	for (int i = 0; i<n; i++){
    		sum = flag = 0;
    		cin >> s;
    		for (int j = 0; j<17; j++){           //需保证前17位全为数字
    			if (isdigit(s[j]))
    				sum = sum + ((int)s[j] - '0')*a[j];
    			else {
    				cout << s << endl;
    				flag = 1;
    				break;
    			}
    		}
    		if (!flag) {
    			sum %= 11;
    			if (s[17] != c[sum]) {
    				cout << s << endl;
    				continue;
    			}
    		}
    		num++;
    	}
    	if (num == n)
    		cout << "All passed";
    	return 0;
    }

    Python: 

    import math
    import numpy as np
    if __name__=='__main__':
        weight=np.array([7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2])
        judge=['1','0','X','9','8','7','6','5','4','3','2']
        n=int(input())
        count=0
        for i in range(n):
            tmp=input()
            key=0
            if tmp[0:len(tmp)-1].isdigit():
                id=np.array([int(tmp[i]) for i in range(len(tmp)-1)])
                key=np.sum(id*weight)%11
            if (not tmp[0:len(tmp)-1].isdigit()) or judge[key]!=tmp[len(tmp)-1] :
                print(tmp)
                count+=1
        if count==0:
            print("All passed")
    
            
  • 相关阅读:
    被动信息收集-dns
    Tcpdump
    Netcat-NC 工具的使用
    无线攻击
    无线渗透实操 aircrack-ng suite
    无线渗透技术概念
    sudo提权复现(CVE-2019-14187)
    Django学习小记-ORM操作概要1
    Django学习小记-cookie的使用(判断是否已登陆)
    Plan 4 Local VRF with NAT
  • 原文地址:https://www.cnblogs.com/F-itachi/p/9974365.html
Copyright © 2020-2023  润新知