PAT_乙级1031
2016-02-05 18:57
211 查看
1031. 查验身份证(15)
时间限制200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(<= 100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出“All passed”。
输入样例1:
4 320124198808240056 12010X198901011234 110108196711301866 37070419881216001X
输出样例1:
12010X198901011234 110108196711301866 37070419881216001X
输入样例2:
2 320124198808240056 110108196711301862
输出样例2:
All passed
#include<stdio.h> int weight[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; char m[12]={'1','0','X','9','8','7','6','5','4','3','2'}; int text(char a[]) { int result=0; int z,i; for(i=0;i<17;i++) result+=weight[i]*(a[i]-'0'); z=result%11; if(m[z]==a[i]) return 1; else return 0; } int main() { int n; int flag=1; int test[100]; scanf("%d",&n); char a[100][19]; for(int i=0;i<n;i++) { scanf("%s",a[i]); test[i]=text(a[i]); } for(int i=0;i<n;i++) if(test[i]==0) { printf("%s\n",a[i]); flag=0; } if(flag==1) printf("All passed"); }
这道题纠结了好久好久,写了差不多一下午,最后逻辑乱掉也不想重新写,休息到快睡觉又重新换了种方法写,觉得思路清晰好多。
要学会经常用函数,不然会很麻烦。
字符串数组的最大个数要加1,因为字符串结尾是/0。
要学会用标识,以前从来不会用flag,看了大神的代码,觉得用这种更方便。
字符串输出是asi码,要减去‘0’。
当输入的是字符串数组时候,scanf是不需要&的。
相关文章推荐
- 今年暑假不AC
- 得分(Score, ACM/ICPC Seoul 2005, UVa1585)
- 我的蓝桥杯历届初赛试题总结
- eclipse导入tomcat run as 没有server
- KVM学习笔记
- markdown语法书
- hdu 1969 Pie
- Debugging D Program on Windows
- 开启Mac自带Apache步骤及遇到问题的解决办法
- 《STL源代码剖析》---stl_alloc.h阅读笔记
- codeforces 624C Graph and String
- 字符串的长度 -- js
- 错误记录--“==”与“=”错误
- hdu2037 今年暑假不AC(贪心||暴力)
- Java 自定义注解详解
- UBIFS 白皮书 -- UBIFS设计简介
- 加载大图到应用内存时所需的缩放步骤
- 使用二分法猜1到100之间的一个数最多需要几次猜对
- linux yum源讲解
- SELECT、POLL/EPOLL、IOCP,以及ACE、libevent、BOOST-ASIO等