检查测试身份证

检查测试身份证。2个合法的身份证号码由一8人地区、日期编号和种种编号加一人校验码组成。校验码的持筹握算规则如下:

多少个法定的身份证号码由一三个人所在、日期编号和种种编号加一位校验码组成。校验码的乘除规则如下:

题目:

多少个法定的身份证编号由17位所在、日期编号和顺序编号加一个人校验码组成。校验码的计量规则如下:

第三对前一5位数字加权求和,权重分配为:{七,九,10,5,八,4,二,壹,6,3,柒,玖,十,五,八,肆,贰};然后将总括的和对1一取模获得值Z;最终依据以下关系对应Z值与校验码M的值:

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

当今加以一些身份证号码,请你验证校验码的灵光,并出口有题指标号码。

输入格式:

输入第壹行提交正整数N(≤100)是输入的身份证编号的个数。随后N行,每行给出1个二拾一个人身份证号码。

出口格式:

按部就公输盘入的相继每行输出1个有题指标身份证号码。那里并不考查前一5人是或不是创制,只检查前一柒个人是不是全为数字且最终一个人校验码总括标准。借使持有号码都符合规律,则输出All passed

输入样例1:

4

320124198808240056

12010X198901011234

110108196711301866

37070419881216001X

出口样例一:

12010X198901011234

110108196711301866

37070419881216001X

输入样例2:

2

320124198808240056

110108196711301862

输出样例贰:

All passed

四个合法的身份证编号由13人地点、日期编号和1一编号加1个人校验码组成。校验码的测算规则如下:

率先对前一6个人数字加权求和,权重分配为:{7,九,10,五,8,4,二,一,陆,三,7,九,10,伍,捌,肆,2};然后将总括的和对11取模获得值Z;最终遵照以下关系对应Z值与校验码M的值:

率先对前一六位数字加权求和,权重分配为:{七,九,10,五,八,四,二,1,6,3,柒,九,十,5,捌,肆,二};然后将总计的和对11取模获得值Z;最终根据以下关系对应Z值与校验码M的值:

上代码:

吃了今天分外亏(毕竟用Java怎么也不能一切AC还拿不到全分太优伤了呀),后天速成了须臾间C++后初叶跟着刷题,前面几道不难点都很简短,用C++都一次通过了,所以就不做笔录了。那道题其实也没怎么好说的,而且自身那些代码纵然整个由此了,但也不是最优的。依旧依附柳婼大大的答案吧,然则本人觉得她那么些答案里面能够向来把b[11]给设为字符数组啊,不然还要把X给换来10

#include <cctype>#include <iostream>using namespace std;bool check(char c[]){    int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};    int sum=0;    for(int i=0;i<17;i++)    {        sum+=a[i]*(c[i]-'0');    }    int index=sum%11;    char b[11]={'1','0','X','9','8','7','6','5','4','3','2'};    return b[index]==c[17];}int main(){    int n,flag=0;    cin>>n;    for(int i=0;i<n;i++)    {        int a=0;        char c[18];            cin>>c;        //bool b=check;        for(int j;j<17;j++)        {            if(isalpha            {                cout<<c<<endl;                a=1;flag=1;                break;            }        }        if(a==0)        {            if(!check            {                cout<<c<<endl;                flag=1;            }        }            }    if (flag == 0) cout << "All passed";    return 0;}

本人实在是为了用cctype里面包车型客车is阿尔法()函数来判定是不是有字母(最起始认为那样方便)才硬用字符数组接受的身份证号。其实用string
s接收的话能够如此做:if(s[i]<'0' || s[i]>'9')

(全体AC的觉得最爽了。。。)

第3对前一五个人数字加权求和,权重分配为:{7,玖,十,5,8,四,二,一,六,三,柒,玖,十,5,八,4,贰};然后将总结的和对1①取模获得值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
Z:0 1 2 3 4 5 6 7 8 9 10M:1 0 X 9 8 7 6 5 4 3 2

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行,每行给出三个二十一人身份证号码。

输入格式:

输入第三行提交正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出叁个二十个人身份证编号。

输入格式:

输出格式:

按部就公输盘入的依次每行输出叁个不通常的身份证编号。那里并不检查前十三人是不是创立,只检查前1七个人是不是全为数字且最后一位校验码总结标准。倘诺具有号码都例行,则输出All passed

输出格式:

依据输入的1一每行输出3个有题指标身份证号码。那里并不调查前二九位是还是不是创建,只检查前二十一个人是还是不是全为数字且最终一人校验码总结标准。借使全数号码都平常,则输出All passed

亚洲必赢官网,输入第贰行提交正整数N(<=
十0)是输入的身份证编号的个数。随后N行,每行给出二个二十一位身份证号码。

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输入样例一:

432012419880824005612010X19890101123411010819671130186637070419881216001X

出口格式:

出口样例壹:

12010X198901011234
110108196711301866
37070419881216001X

出口样例一:

12010X19890101123411010819671130186637070419881216001X

根据输入的1壹每行输出3个很是的身份证号码。那里并不检查前一5人是还是不是创建,只检查前一六人是还是不是全为数字且最终一人校验码计算标准。借使全部号码都符合规律,则输出“All
passed”。

输入样例2:

2
320124198808240056
110108196711301862

输入样例2:

2320124198808240056110108196711301862

输入样例一:

出口样例二:

All passed

认知:第一遍写的交给上去有3个测试的没过。后来在牛客网上的均等的题过了。同理可得牛客网等那些抄
PTA 题的 Online Judge 不标准。

  第3遍用的是协会,用结构对 cache
是和谐的,可是同样的算法正是没过。结果都以相同的,不用结构用数组居然就过了。进度或然很关键的!

 1 #include <stdio.h>
 2 
 3 int main(int argc, char const *argv[])
 4 {
 5     int weight[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
 6     char M[] = "10X98765432";
 7 
 8     int n;
 9 
10     scanf("%d", &n);
11 
12     char number[n][19];
13 
14     for ( int i = 0; i < n; i++ ) {
15         scanf("%s", number[i]);
16     }
17 
18     int Allpass = 1;
19     for ( int i = 0; i < n; i++ ) {
20         int sum = 0;
21         for ( int j = 0; j < 17; j++ ) {
22             sum += (number[i][j]-'0') * weight[j];
23         }
24         int over = sum % 11;
25         if ( M[over] != number[i][17] ) {
26             Allpass = 0;
27             printf("%s\n", number[i]);
28         }
29     }
30     if ( Allpass ) {
31         printf("All passed\n");
32     }
33     return 0;
34 }

 

出口样例2:

All passed

咀嚼:第一回写的交付上去有二个测试的没过。后来在牛客网上的1样的题过了。同理可得牛客网等那个抄
PTA 题的 Online Judge 不规范。

  第三回用的是布局,用结构对 cache
是上下一心的,可是同样的算法正是没过。结果都是一致的,不用结构用数组居然就过了。进度依然很关键的!

 1 #include <stdio.h> 2  3 int main(int argc, char const *argv[]) 4 { 5     int weight[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; 6     char M[] = "10X98765432"; 7  8     int n; 9 10     scanf("%d", &n);11 12     char number[n][19];13 14     for ( int i = 0; i < n; i++ ) {15         scanf("%s", number[i]);16     }17 18     int Allpass = 1;19     for ( int i = 0; i < n; i++ ) {20         int sum = 0;21         for ( int j = 0; j < 17; j++ ) {22             sum += (number[i][j]-'0') * weight[j];23         }24         int over = sum % 11;25         if ( M[over] != number[i][17] ) {26             Allpass = 0;27             printf("%s\n", number[i]);28         }29     }30     if ( Allpass ) {31         printf("All passed\n");32     }33     return 0;34 }
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

出口样例一:

12010X198901011234
110108196711301866
37070419881216001X

输入样例贰:

2
320124198808240056
110108196711301862

出口样例贰:

All passed

时间限定

400 ms

内部存款和储蓄器限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

陈越

 

解题思路:在认清一个身份证编号是不是符合供给时,应该先对前1柒个字符举行判断,假设出现了不是数字的字符,就将它输出。小编那边在认清前一多少个字符是不是数字的时候就已经将前一捌个数加权求和了,要是未有出现其余字符,再拓展下一步判断,假如不符合供给则输出。那里在认清全数的身份证号码是还是不是全部是符合必要的就相比麻烦了,要定义的三个与人口壹样的数组,将它初步化为0,当第i个身份证号码不符合须求时,将数组下标为i的数置为一,假使数组里面有着的数都为0,则足以出口“

All passed

”。

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int i, j;
  int n;
  char s[100][19];
  char m[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
  int q[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
  int sum = 0;
  int z, count = 0;
  int flog[100];
  int flog1 = 0;

  for(i = 0; i < 100; i++)
    flog[i] = 0;

  scanf("%d", &n);

  if(n < 0 || n > 100)
  {
    exit(0);
  }

  for(i = 0; i < n; i++)
  {
    scanf("%s", s[i]);
  }

  for(i = 0; i < n; i++)
  {
    sum = 0;
    for(j = 0; j < 17; j++)
    {
      if((int)(s[i][j] - '0') > 9 || (int)(s[i][j] - '0') < 0)//判断是否有除数字外的字符
      {
        flog[i] = 1;
      }
      sum += ((int)(s[i][j]-'0'))*q[j];//将前17个数加权求和
    }
    z = sum % 11;
    if(m[z] != s[i][17])
    {
      flog[i] = 1;
    }
  }

  for(i = 0; i < n; i++)
  {
    if(flog[i] == 1)
      count++;
  }

  for(i = 0; i < n; i++)
  {
    if(flog[i] == 1)
    {
      flog1 = 1;
      printf("%s\n", s[i]);
    }
  }

  if(flog1 == 0)
    printf("All passed\n");

  return 0;
}

 

网站地图xml地图