CCF-训练50题-NO.11-身份证校验
来源:互联网 发布:国寿资管 知乎 编辑:程序博客网 时间:2024/06/08 05:23
题目描述
我国国标〖GB 11643-1999〗中规定:公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。其校验码(最后一位)计算方法和步骤为:
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, … , 16 ,先对前17位数字的权求和
其中Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模
Y = mod(S, 11)
(3)通过模Y查下表得到对应的校验码
输入
输入若干行,每行一个身份证号码,最后一行输入-1
输出
输出1代表正确,0代表错误
样例代码
#include <iostream>using namespace std;int wi[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};char Y[11]={'1','0','X','9','8','7','6','5','4','3','2'};int cal(char a,int c){ int b=a-'0'; return b*c;}int main(){ int sum[17]; int pos=-1; int givepos[100]; string S; while (1){ int res=0; cin>>S; if (S=="-1") break; pos++; for (int i=0;i<17;i++){ sum[i]=cal(S[i],wi[i]); res+=sum[i]; } int mod=res%11; if (Y[mod]==S[17]) givepos[pos]=1; else givepos[pos]=0; } for (int i=0;i<=pos;i++){ cout<<givepos[i]<<endl; //if (i<pos) cout<<endl; } return 0;}
阅读全文
0 0
- CCF-训练50题-NO.11-身份证校验
- CCF-训练50题-NO.5-画图
- CCF-训练50题-NO.13-数码管
- CCF-训练50题-NO.1-数塔问题
- CCF-训练50题-NO.2-图像旋转问题
- CCF-训练50题-NO.3-数字排序问题
- CCF-训练50题-NO.4-相邻数对问题
- CCF-训练50题-NO.6-字符串匹配问题
- CCF-训练50题-NO.7-日历问题
- CCF-训练50题-NO.8-生理周期
- CCF-训练50题-NO.9-约瑟夫问题
- CCF-训练50题-NO.10-恺撒Caesar密码
- CCF-训练50题-NO.12-多项式加法
- CCF-训练50题-NO.14-字母排列
- CCF-训练50题-NO.15-选美比赛
- CCF-训练50题-NO.16-字符串数字置换
- CCF-训练50题-NO.17-写出来吧
- CCF-训练50题-NO.18-成绩大排队
- 移动测试工程师必须知道的10个开源框架
- OpenGL--着色器2
- map()
- PAT (Basic Level) Practise (中文)1041. 考试座位号(15)
- OpenGL--高级纹理知识
- CCF-训练50题-NO.11-身份证校验
- 深度学习与计算机视觉 看这一篇就够了
- 移动端页面自适应
- CCF-训练50题-NO.12-多项式加法
- D
- C和指针之函数递归实现把amount表示的值转换为单词形式written_amount(unsigned int amount,char *buffer)
- linux自动安装php7.2.0脚本
- 双网卡配置不同路由实现内外网同时访问
- 51Nod-1054-最长等差数列