Práctica PAT (nivel básico) (chino) 1031 Verificación de identidad (15 puntos)

Un número de tarjeta de identificación legal consta de 17 dígitos de región, número de fecha y número de secuencia más 1 código de verificación. Las reglas de cálculo del código de verificación son las siguientes:

Primero, los primeros 17 dígitos se ponderan y se suman, y la distribución del peso es: {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; Luego tome la suma calculada módulo 11 para obtener el valor Z; finalmente, corresponda el valor Z y el valor del código de verificación M de acuerdo con la siguiente relación:

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

Ahora, dados algunos números de identificación, verifique la validez del código de verificación y emita el número en cuestión.

Formato de entrada:

Ingrese la primera línea para dar un número entero positivo N (≤100) es el número de números de identificación de entrada. Luego hay N líneas, y cada línea da un número de tarjeta de identificación de 18 dígitos.

Formato de salida:

Muestra 1 número de tarjeta de identificación problemático por línea en el orden de entrada. No verifica si los primeros 17 dígitos son razonables, solo verifica si los primeros 17 dígitos son todos números y el último código de verificación de 1 dígito se calcula con precisión. Si todos los números son normales, da salida a Todo aprobado.

Ejemplo de entrada 1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

Ejemplo de salida 1:

12010X198901011234
110108196711301866
37070419881216001X

Ejemplo de entrada 2:

2
320124198808240056
110108196711301862

Ejemplo de salida 2:

All passed
! ! ! ! ! ! ! ¿Aquí para explicarte qué es la suma ponderada?

Ponderación: el producto de cada número de identificación y el peso de la posición correspondiente . Por ejemplo, número de ID 320124198808240056, la distribución de peso es: {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}, el primero ponderando solo 3*7 , la segunda vez 2*9 , y así sucesivamente.

La suma ponderada es, por supuesto, la suma de todos los números ponderados (como 3 * 7+2 * 9+.....+) , aquí debe tenerse en cuenta que después de la suma ponderada de los primeros 17 dígitos de la tarjeta de identificación , se toma el módulo de 11 (resto) para juzgar si es igual al código de verificación 18.

C++:
#include<iostream>
using namespace std;
int main()
{
    int a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};   //题目所给的权重分配
    char c[]={'1','0','X','9','8','7','6','5','4','3','2'};//权重求和取模后所对应的校验码
    int n;
    cin>>n;
    int sum=0;
    int judge=0; //用来判断所给身份证是否有问题 0表示为没有问题 1表示为有问题
    string s;
    for(int i=1;i<=n;i++)
    {
        cin>>s;   //这里没有涉及输入空格所以用cin直接输入即可
        sum=0;    //权重之和
        for(int j=0;j<17;j++)  //遍历身份证前十七位数字
        {
            if(s[j]=='X')    //如果出现非数字即身份证有问题
            {
                cout<<s<<endl;  //直接输出
                judge=1;      //然后判断标记为1(有问题)
                break;
            }
                
            else     
            {
                sum+=( (s[j]-'0') *a[j]);    //否则的话就加权这个数字
                
            }
                
        }
        if(c[sum%11]!=s[17])    //判断加权求和取模后对应的校验码是否等于最后一位
        {
            cout<<s<<endl;     //如果不是即身份证有问题,输出即可
            judge=1;           //判断标记
        }
        
            
    }
    if(judge==0)   //所有输入完成后若标记还是为0即所有身份证都没有问题
            cout<<"All passed";   //输出All passed
}

Este problema también se puede resolver utilizando matrices bidimensionales y métodos de conteo (se recomienda pensar en un problema desde múltiples ángulos y direcciones)

lenguaje C:
#include<stdio.h>
int main()
{
    int n,sum,count=0,judge;             //count表示身份证有问题的数量
    int a[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char c[]={'1','0','X','9','8','7','6','5','4','3','2'};
    char num[101][101];     //二维字符数组来输入
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",&num[i]);
    }
    for(int i=1;i<=n;i++)
    {
        sum=0;           //权重之和
        judge=0;
        for(int k=0;k<17;k++)
        {
            if(num[i][k]=='X') 
                judge=1;         //判断身份证是否有问题  1为有问题  0为没有问题
            else
                sum+=(num[i][k] - '0') * a[k];    //加每个符合条件加权后的数
        }
        if(c[sum%11] != num[i][17])    //判断加权求和取模后对应的校验码是否等于最后一位
            judge=1;
        if(judge == 1)      
        {
            printf("%s\n",num[i]);
            count++;              //每输出一串有问题的身份证号码count就自增1
        }
     } 
     if(count == 0)            //count为0即没有有问题的身份证号码
         printf("All passed");
    return 0;
    
}

Supongo que te gusta

Origin blog.csdn.net/H1727548/article/details/128885087
Recomendado
Clasificación