这一题很搞心态,出现了很多问题,对我确实有帮助,1是数据的存储,我不知道怎么存,是一下子全部存起来还是,对一次的数据进行处理,然后保存起来最后输出,显然,后者麻烦,2就是在处理字符串中对出现的字母X没有做出正确的处理,当时感觉15分的题,没太多想并没有设置足够多的标志数,3最近头有点昏昏的,对循环的感觉有点模糊。
先看错误
我的错误代码 :思路还是不太通,但是还可以
#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;
}