★题目:

★题目分析:本题要求输入一个数字n,随后n行输入n个身份证号码。之后进行进一步的判断把错误的身份证号码输出。如果全部正确输出All passed。

★思路方法:

①按题目要求输入。

②对前17位进行判断,若出现错误字符则将之存入待输出位置。

③对前17位进行加权处理并对11取模。

④找到第18位应该是的字符并且和身份证上实际的字符进行比较。

⑤对所有情况综合处理并按要求输出。

★注意:身份证共18位,实际字符应与a【17】进行比较

★代码解释:

#include<stdio.h>
int main()
{
    int PAN(char a[18]);               //对身份证号码的正确性进行判断
    char a[100][18];                   //用于存放所输入的身份证号码
    int b[100];
    int n,i,j,o;
    int t;                             //用于判断身份证
    int s=0;                          //用于统计正确身份证的数量
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s",a[i]);
        t=PAN(a[i]);
        b[i]=t;
        if(t==1)
            s++;
        t=0;
    }
    if(s!=n)                            //此时所输入的身份证号码不全部都正确
        for(j=0;j<i;j++)
        {
            if(b[j]==0)
            {
                for(o=0;o<=17;o++)
                printf("%c",a[j][o]);
                printf("\n");
            }                           //对不正确的身份证号码进行输出
        }
    else
        printf("All passed\n");         //全部正确的情况
}
int PAN(char a[18])
{
    int i,t=1,s=0,z;
    int b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char c[11]={'1','0','X','9','8','7','6','5','4','3','2'};
    char d;
    for(i=0;i<17;i++)
        if(a[i]<'0'||a[i]>'9')
            {t=0;break;}                //对前17位进行判断
    if(t!=0)
    {
        for(i=0;i<17;i++)
        s=s+(a[i]-'0')*b[i];
        z=s%11;
        d=c[z];                         //身份证第18位应为的字符
    }
    if(d!=a[17])                        //应为的与实际的进行比较
        t=0;
return(t);                              //若t为1则正确,0则错误
}

★测试结果:

版权声明:本文为Dreamer-545原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Dreamer-545/p/8352666.html