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

3个法定的身份证号码由1伍人地区、日期编号和各种编号加一位校验码组成。校验码的计算规则如下:

题目:

贰个法定的身份证号码由1八位地区、日期编号和各种编号加1人校验码组成。校验码的测算规则如下:

第贰对前1五人数字加权求和,权重分配为:{七,九,拾,伍,八,4,2,一,6,③,七,九,十,伍,八,四,二};然后将总结的和对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

当今加以1些身份证编号,请您验证校验码的有用,并出口有标题的号子。

输入格式:

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

输出格式:

依据输入的种种每行输出三个有标题标身份证编号。那里并不检查前一伍个人是不是成立,只检查前贰拾位是还是不是全为数字且最后一人校验码总结标准。假若全体号码都经常,则输出All passed查验身份证。。

输入样例一:

4

320124198808240056

12010X198901011234

110108196711301866

37070419881216001X

出口样例一:

12010X198901011234

110108196711301866

37070419881216001X

输入样例二:

2

320124198808240056

110108196711301862

输出样例贰:

All passed

一个合法的身份证编号由壹陆位地区、日期编号和各类编号加一人校验码组成。校验码的盘算规则如下:

率先对前一七位数字加权求和,权重分配为:{7,玖,10,5,八,四,二,1,陆,叁,7,九,10,5,8,四,二};然后将总括的和对1一取模获得值Z;最终遵照以下关系对应Z值与校验码M的值:

率先对前1伍人数字加权求和,权重分配为:{柒,九,十,五,八,四,2,一,陆,三,7,9,十,伍,捌,四,二};然后将计算的和对1一取模得到值Z;最终依照以下关系对应Z值与校验码M的值:

上代码:

吃了明日11分亏(毕竟用Java怎么也不能够一切AC还拿不到全分太痛楚了啊),今天速成了刹那间C++后开头跟着刷题,前边几道轻松题都相当的粗略,用C++都3回通过了,所以就不做笔录了。那道题其实也没怎么好说的,而且自身这么些代码纵然整个由此了,但也不是最优的。照旧依附柳婼大大的答案吧,但是自身以为她那些答案里面能够一向把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的以为到最爽了。。。)

率先对前十八个人数字加权求和,权重分配为:{7,玖,10,五,捌,肆,二,一,六,三,七,玖,拾,伍,捌,四,二};然后将总括的和对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

到现在加以1些身份证编号,请您验证校验码的灵光,并出口有标题标号码。

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

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

输入格式:

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

输入格式:

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

输入格式:

出口格式:

依照输入的次第每行输出2个不符合规律的身份证编号。那里并不查看前壹五人是或不是站得住,只检查前一八个人是或不是全为数字且最后1人校验码计算标准。如若具有号码都健康,则输出All passed

出口格式:

依据输入的顺序每行输出三个有毛病的身份证编号。那里并不检查前拾伍人是不是合理,只检查前二12位是还是不是全为数字且倒数一位校验码总括标准。借使具备号码都例行,则输出All passed

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

输入样例一:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输入样例一:

432012419880824005612010X19890101123411010819671130186637070419881216001X

出口格式:

出口样例1:

12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X19890101123411010819671130186637070419881216001X

按部就公输子入的依次每行输出一个有毛病的身份证编号。那里并不检查前1五位是不是成立,只检查前一八人是不是全为数字且最终一人校验码总结标准。要是持有号码都通常,则输出“All
passed”。

输入样例二:

2
320124198808240056
110108196711301862

输入样例贰:

2320124198808240056110108196711301862

输入样例1:

金沙注册送58,出口样例二:

All passed

咀嚼:第2次写的交由上去有1个测试的没过。后来在牛客网上的一样的题过了。不问可见牛客网等那几个抄
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 }

 

出口样例二:

All passed

咀嚼:第1遍写的提交上去有贰个测试的没过。后来在牛客网上的壹律的题过了。不问可见牛客网等这几个抄
PTA 题的 Online Judge 不纯粹。

  第2遍用的是构造,用结构对 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

作者

陈越

 

解题思路:在认清贰个身份证编号是不是符合供给时,应该先对前21个字符进行判定,借使出现了不是数字的字符,就将它输出。小编那里在认清前一七个字符是否数字的时候就早已将前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地图