1031 查验身份证 (15 分)

一个合法的身份证号码由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
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
原题链接

代码

#include <iostream>
#include <string>
using namespace std;
int main() {int n;cin >> n;int zm[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};int weight[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};string str;int sum; // calculate sumint flag = 0; // if there is no wrong idfor (int i = 0; i < n; i++) { // cin and then cout sum = 0;cin >> str;int flag2 = 0;for (int j = 0; j < 17; j++) {if  (str[j] <'0' || str[j] > '9') {// 如果有不是字符的,就报错然后输出cout << str << endl;flag = 1;flag2 = 1;// 跳过下面的步骤,直接检测下一个代码break;}}for (int j = 0; j < 17 && flag2== 0; j++) {// 全是数字sum += (str[j] - '0') * weight[j];}if  (zm[sum%11] != str[17] && flag2== 0) {cout << str << endl;flag = 1;}}if  (flag==0) cout <<"All passed";// no wrong idreturn 0;
}

题解

  • 本题我第一次把“All passed”写成了“ALL passed”,属于审题不清。
  • 单个数字字符0~9转化为数字可以使用char - '0',不要用stoi(),因为这个函数要求输入参数是字符串。参考:https://www.cplusplus.com/reference/string/stoi/

参考代码

#include <iostream>
using namespace std;
int a[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
int b[11] = {1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2};
string s;
bool isTrue() {int sum = 0;for (int i = 0; i < 17; i++) {if (s[i] < '0' || s[i] > '9') return false;sum += (s[i] - '0') * a[i];}int temp = (s[17] == 'X') ? 10 : (s[17] - '0');return b[sum%11] == temp;
}
int main() {int n, flag = 0;cin >> n;for (int i = 0; i < n; i++) {cin >> s;if (!isTrue()) {cout << s << endl;flag = 1;}}if (flag == 0) cout << "All passed";return 0;
}

PAT乙级 1031 查验身份证 (15 分)相关推荐

  1. PAT 乙级 1031 查验身份证 (15分)

    1031 查验身份证 (15分) 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2, ...

  2. C++学习之路 | PTA乙级—— 1031 查验身份证 (15 分)(精简)

    1031 查验身份证 (15 分) 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2 ...

  3. 乙级--1031 查验身份证 (15分)(中等)

    题目描述:(15) 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7 ...

  4. PAT 乙级 1031. 查验身份证(15) Java版

    一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...

  5. 【2020模拟考试T1】【PAT乙】1031 查验身份证 (15分)模拟

    problem 1031 查验身份证 (15分) 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10, ...

  6. 1031 查验身份证 (15 分)

    1031 查验身份证 (15 分) 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2 ...

  7. PAT乙级1031 查验身份证

    1031. 查验身份证(15) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 一个合法的身份证号码由17位地区. ...

  8. PAT乙级(1031 查验身份证)

    PAT乙级1031题解题: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}:然后将计算的和对11取模得到值Z:最后按照以下关系对应Z ...

  9. pat 乙级 1031 查验身份证(C++)

    题目 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5 ...

最新文章

  1. CSS 样式书写规范
  2. mysql webservice接口_WebService接口在PHP中的使用
  3. 计划工程师dadafksjh
  4. 【职场】看一位前端工程师如何上班摸鱼
  5. Linux学习之系统编程篇:mmap练习
  6. leetcode-387-字符串中的第一个唯一字符
  7. python自动获取cookie_selenium3+python自动化12-cookie相关操作(获取和删除)
  8. 小小的 likely 背后却大有玄机!
  9. 绑定到异步的ObservableCollection
  10. eclipse-阶段二-字体修改问题
  11. CS229学习笔记(1)引言、单变量线性回归
  12. UE4开发游戏的流程
  13. 智图—源于QQ空间图片WebP化的思考
  14. 梦幻西游易语言辅助教程
  15. python编写水仙花数(超完全数字不变数、自恋数、自幂数、阿姆斯特朗数)
  16. 人人都是产品经理——一切从Kick Off开始
  17. Python查询四六级成绩
  18. 小说阅读网html+css+JavaScript
  19. 【机器人学导论(第四版)】1-绪论
  20. C语言|鼠标点击开始

热门文章

  1. 群签名和环签名的区别_苹果企业签名和苹果超级签名的区别
  2. 对于Vue组件的初步认识(未整理)
  3. c语言枚举常量,浅述C语言中枚举enum的用法
  4. 可以判断用户打开页面次数吗?_看前端如何单枪匹马实现小程序页面级版本控制...
  5. 关于四元数的个人理解
  6. ROS入门 通信架构
  7. caffe :error MSB4062: 未能从程序集** 加载任务“NuGetPackageOverlay”
  8. AcWing1064.骑士(状压DP)题解
  9. 定义一个Point类,派生出Circle类,计算各派生类对象的面积Area()
  10. [转]优秀的女孩是没有性生活的