//这题让我认识到断点调试的极大好处!!!棒极了! //这一题调试了很久,后来改了gets为scanf("%s",str)才成功,用gets()时我也去除了换行符啊!目前仍然不知道怎么回事! //我靠,后来换成gets和getchar()在oj上又全部通过了!看来可能之前是别的原因造成的 //无论如何,下次用断点调试!加油! #include<stdio.h> #include<string.h> //#define LOCAL int rate[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char change[11]={'1','0','X','9','8','7','6','5','4','3','2'}; int main(){ #ifdef LOCAL freopen("B1031data.in","r",stdin); freopen("B1031data.out","w",stdout); #endif //这种题可以边读入边输出,因此不需要二维数组 //关于验证是否是数字,可能要用是否在‘0’~‘9’之间了 //从0开始存放到str中 int n=0,count=0,last=0,i;//n<=100 int number; bool flag=true; char str[20];//这个确实是字符型数组啊 scanf("%d",&n); number=n; //getchar();//这一句很重要,不然就会吞掉一行数据 while(n--){ last=0; //gets(str); scanf("%s",str); flag=true; for(i=0;i<17;i++){//注意变量的局部性还是应该全局性。自增的不要总是放在循环中申明,看清外面要不要用到再确定在哪里申明 if(!(str[i]>='0'&&str[i]<='9')) break; last+=(str[i]-'0')*rate[i];//一开始以为这里要除以100,结果发现并不要除 } if(i<17){//应该=17才是对的 flag=false; puts(str); } else{ //如果前面的正确,再来验证最后一位 if(str[17]!=change[last%11]) { flag=false; puts(str); } } if(flag==true){ count++; } /*else{ puts(str);//默认输出后换行 }*/ } if(count==number){ printf("All passed\n"); } return 0; }