[刷题] PTA 查验身份证
题目:
7-63 查验身份证 (15 分)
首先对前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(≤)是输入的身份证号码的个数。随后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
思路:
1、检验1-17位是否为数字
2、检验18位验证码是否正确
程序:
1 #include<stdio.h>
2 #include<string.h>
3
4 char weight[]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
5 char M[]= {'1','0','X','9','8','7','6','5','4','3','2'};
6 int main() {
7 int N,k,i,z=0,isNum,allPassed=1;
8 char str[19];
9 scanf("%d",&N);
10 while(N--) {
11 isNum = 1;
12 z = 0;
13 scanf("%s",&str);
14 for(i=0; i<17; i++) {
15 if(!(str[i]>47 && str[i]<58)) {
16 isNum = 0;
17 allPassed = 0;
18 printf("%s\n",str);
19 break;
20 }
21 }
22 if(isNum == 1) {
23 for(i=0; i<17; i++) z += (str[i]-'0')*weight[i];
24 z%=11;
25 if(M[z]!=str[17]) {
26 allPassed = 0;
27 printf("%s\n",str);
28 }
29 }
30 }
31 if(allPassed == 1) printf("All passed\n");
32 return 0;
33 }
网友的程序:
1 #include <stdio.h>
2 #include <string.h>
3 #define ID_LEN 18
4 #define CHECKCODE_LEN 10
5
6 int main(){
7 //N行输入N个18位的身份证号码
8 char ID[ID_LEN+1];
9 int weight[ID_LEN-1]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
10 char M[CHECKCODE_LEN+1]={'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
11 int N, i, j, Z;
12 int allPassed=1; //假设全部通过,遇到非法号码时置0
13 scanf("%d", &N);
14 for(i=0; i<N; i++){
15 Z = 0;
16 scanf("%s", ID);
17 for(j=0; j<ID_LEN-1; j++){
18 Z += (ID[j]-'0')*weight[j];
19 }
20 Z %= 11;
21 if(M[Z]!=ID[ID_LEN-1]){
22 allPassed = 0;
23 printf("%s\n", ID);
24 }
25 }
26 if(allPassed){
27 printf("All passed\n");
28 }
29
30 return 0;
31 }
分析:
1、和普通变量一样,出于业务逻辑设置的flag变量也分全局和局部,在此题中,allPassed是全局flag变量(只要一个出错就不是全对了),isNum是局部flag变量(判断每个字符串前清零)
2、如果原始数据错误,则验证码不可能算对。程序2牺牲了一定效率,但简洁易读
[刷题] PTA 查验身份证的更多相关文章
- [刷题] PTA 02-线性结构3 Reversing Linked List
链表逆序 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namesp ...
- [刷题] PTA 03-树3 Tree Traversals Again
用栈实现树遍历 1 #include<stdio.h> 2 #include<string.h> 3 #define MAXSIZE 30 4 5 int Pre[MAXSIZ ...
- [刷题] PTA 7-61 找最长的字符串
程序: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 81 4 5 int main() { 6 char ch[N ...
- [刷题] PTA 7-62 切分表达式 写个tokenizer吧
我的程序: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 50 4 char token[]= {'+','-',' ...
- [刷题] PTA 04-树4 是否同一棵二叉搜索树
程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct TreeNode *Tree; 4 struct ...
- [刷题] PTA 03-树2 List Leaves
程序: 1 #include <stdio.h> 2 #include <queue> 3 #define MaxTree 20 4 #define Null -1 5 usi ...
- [刷题] PTA 03-树1 树的同构
程序: 1 #include <stdio.h> 2 #define MaxTree 10 3 #define ElementType char 4 #define Tree int 5 ...
- [刷题] PTA 02-线性结构1 两个有序链表序列的合并
程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 typedef st ...
- [刷题] PTA 02-线性结构4 Pop Sequence
模拟栈进出 方法一: 1 #include<stdio.h> 2 #define MAXSIZE 1000 3 4 typedef struct{ 5 int data[MAXSIZE]; ...
随机推荐
- Java 学习记录
•Eclipse相关 Eclipse常用设置 解决 Eclipse 项目中有红色感叹号的详细方法(图文) JRE System Library [JavaSE-1.8](unbound) •Java ...
- Python基础之:Python中的类
目录 简介 作用域和命名空间 class 类对象 类的实例 实例对象的属性 方法对象 类变量和实例变量 继承 私有变量 迭代器 生成器 简介 class是面向对象编程的一个非常重要的概念,python ...
- .Net Core 3.1浏览器后端服务(五) 引入定时任务Quartz.Net
一.前言 近期项目中遇到一些需求,需要定时写入数据库,定时刷新缓存的问题,因此需要引入任务调度机制. 我的选择是使用 Quartz.Net,使用的版本是 3.2.4 这里强调一点:3.x的版本与2.x ...
- CentOS7 搭建 K8S 环境
前期准备 环境规划 K8S 与Docker兼容问题 k8s v1.18.0 => Docker v18.x k8s v1.19.0 => Docker v19.x 软件 版本 Linux操 ...
- (十四)struts2的国际化
一.国际化的概念 国际化是指web程序在运行时,根据客户端请求的国家.语言的不同而显示不同的界面. 例如,如果请求来自中文客户端,则页面的显示,提示信息等都是中文,如果是英文客户端,则显示英文信息. ...
- Java 在Excel中添加水印(单一水印、平铺水印)
在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作centos7.8-15
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作centos7.8-15 欢迎加QQ群:1026880196 进行交流学习 制作OpenS ...
- Linux下屏幕亮度的调节
1 概述 Linux下的屏幕调节可以通过图形界面或者命令行进行调节,图形界面的话主要就是在设置中进行调节,如果设置中没有相应的选项可以进行手动调节. 2 手动调节 2.1 手动屏幕调节 亮度由ACPI ...
- mysqli_fetch_array()、mysqli_fetch_assoc、mysqli_fetch_row()和mysqli_fetch_object()的区别
mysqli_fetch_array() 来使用或输出所有查询的数据. mysqli_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有 返回根据从结果集取得的行生 ...
- hdu 5063 不错的小想法题(逆向处理操作)
题意: 刚开始的时候给你一个序列,长度为n,分别为a[1]=1,a[2]=2,a[3]=3,a[4]=4...a[n]=n,然后有4种操作如下: Type1: O 1 call fun1( ...