PTA1031 查验身份证 (15 分)C语言2022/1/21

这一题很搞心态,出现了很多问题,对我确实有帮助,1是数据的存储,我不知道怎么存,是一下子全部存起来还是,对一次的数据进行处理,然后保存起来最后输出,显然,后者麻烦,2就是在处理字符串中对出现的字母X没有做出正确的处理,当时感觉15分的题,没太多想并没有设置足够多的标志数,3最近头有点昏昏的,对循环的感觉有点模糊。

先看错误

链接:PTA | 程序设计类实验辅助教学平台

我的错误代码 :思路还是不太通,但是还可以

#include<stdio.h>
int main(){
    int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//权值
    int z[11]={0,1,2,3,4,5,6,7,8,9,10};//余数
    char m[11]={'1','0','X','9','8','7','6','5','4','3','2'};//对应项
    char re[100000];
    int i=0,j=0,tem=0,count=0;
    int t,c=0,e,k=1,dd=0;
    int con=18;
    char b[100000];
    scanf("%d\n",&t);
    for(i=0;i<t;i++){
        gets(b);
        for(j=0;j<18;j++){
            tem=(b[j]-'0')*a[j]+tem;
        }
        c=tem%11;
        if(m[c]==b[17]){
            count++;
        }
        else{
            for(e=0;e<con;e++){
                re[dd]=b[e];
                dd=dd+1;
            }
        }
        c=0;
        tem=0;
    }
    if(count==t){
        printf("All passed");
    }
    for(i=0;i<dd;i++){
        printf("%c",re[i]);
        if((i+1)%18==0&&i!=dd-1){
            printf("\n");
        }
    }
    return 0;
}

 很无语,编译器明明可以跑,但是到pta平台就不行,多输出一行。

肯定是我的问题。

看看了大佬写的真牛在这里分享一下,大佬的真的没有多余变量,真的丝滑,用二维数组来存储

字符串。牛的

 #include <stdio.h>
  int main(){
    int n,i,j,weight=0,flag=0,correct=0,count=0,weightList[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
     char code[12]={'1','0','X','9','8','7','6','5','4','3','2'};
     //flag 用于记录前17位数字是否合规,当有不合理数字时及时跳出循环,并标记flag为1
     //correct 用于记录校验位是否通过,1即通过,说明身份证核验成功 不需要输出;
     //count记录通过的身份号数量
      scanf("%d",&n);
     char arr[n][19];
     for(i=0;i<n;i++){scanf("%s",arr[i]);}
     for(i=0;i<n;i++){
         weight=0;
         flag=0;
         correct=0;
         for(j=0;j<17;j++){
             if((arr[i][j]<='9')&&(arr[i][j]>='0')){//判定数字是否合规
                 weight=weight+(arr[i][j]-'0')*weightList[j];
            }else{
                 flag=1;
                 break;
             }
         }
         if(flag==0&&arr[i][j]==code[weight%11]){
             count++;
             correct=1;
         }

         if(correct==0){
             printf("%s\n",arr[i]);
         }
     }
     if(count==n){//如果全部都通过        
        printf("All passed\n");
    }
    return 0;
 }

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值