检验身份证

By admin in 4858.com on 2019年3月31日

八个官方的身份证号码由1陆个人所在、日期编号和顺序编号加壹位校验码组成。校验码的估算规则如下:

3个法定的身份证编号由1四个人所在、日期编号和各类编号加一个人校验码组成。校验码的盘算规则如下:

题目:

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

先是对前贰10位数字加权求和,权重分配为:{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 10M:1 0 X 9 8 7 6 5 4 3 2

今昔加以一些身份证编号,请您验证校验码的实用,并出口有题目标号码。

输入格式:

输入第贰行提交正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出一个十几位身份证号码。

出口格式:

遵照输入的各种每行输出一个非常的身份证编号。那里并不查看前17人是不是站得住,只检查前1五个人是不是全为数字且最后一个人校验码总计标准。假若具有号码都健康,则输出All passed

输入样例1:

4

320124198808240056

12010X198901011234

110108196711301866

37070419881216001X

出口样例1:

12010X198901011234

110108196711301866

37070419881216001X

检验身份证。输入样例2:

2

320124198808240056

110108196711301862

输出样例2:

All passed

多个合法的身份证编号由1柒位地方、日期编号和一一编号加一个人校验码组成。校验码的盘算规则如下:

先是对前1伍人数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将总结的和对11取模得到值Z;最终依据以下关系对应Z值与校验码M的值:

首先对前1陆个人数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对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的感觉到最爽了。。。)

首先对前1多少人数字加权求和,权重分配为:{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
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行,每行给出二个十12个人身份证号码。

输入格式:

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

输入格式:

出口格式:

根据输入的相继每行输出二个有毛病的身份证号码。那里并不检查前1五个人是不是创建,只检查前17个人是不是全为数字且最后一个人校验码总结标准。如若具有号码都例行,则输出All passed

出口格式:

遵照输入的一一每行输出一个有题指标身份证号码。那里并不查看前1陆人是还是不是站得住,只检查前贰九人是还是不是全为数字且最终一人校验码总括标准。假使全部号码都例行,则输出All passed

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

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输入样例1:

432012419880824005612010X19890101123411010819671130186637070419881216001X

出口格式:

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X19890101123411010819671130186637070419881216001X

遵照输入的各种每行输出贰个有题指标身份证编号。那里并不查看前15位是还是不是合理,只检查前1两个人是还是不是全为数字且最终一个人校验码计算标准。假诺全数号码都例行,则输出“All
passed”。

输入样例2:

2
320124198808240056
110108196711301862

输入样例2:

2320124198808240056110108196711301862

输入样例1:

出口样例2:

All passed

咀嚼:第三次写的付出上去有3个测试的没过。后来在牛客网上的一律的题过了。同理可得牛客网等那么些抄
PTA 题的 Online Judge 不确切。

  第1次用的是协会,用结构对 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

认知:第三遍写的交给上去有多个测试的没过。后来在牛客网上的相同的题过了。不问可见牛客网等那个抄
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

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X

输入样例2:

2
320124198808240056
110108196711301862

4858.com,出口样例2:

All passed

时刻限定

400 ms

内部存款和储蓄器限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

陈越

 

解题思路:在认清一个身份证编号是或不是符合供给时,应该先对前18个字符进行判断,假设现身了不是数字的字符,就将它输出。笔者那里在认清前1八个字符是还是不是数字的时候就早已将前1三个数加权求和了,尽管没有出现别的字符,再举办下一步判断,假如不符合供给则输出。那里在认清全数的身份证号码是还是不是全部是符合须要的就相比麻烦了,要定义的一个与人口一样的数组,将它伊始化为0,当第i个身份证编号不符合供给时,将数组下标为i的数置为1,固然数组里面全体的数都为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地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有