本文主要是介绍【PAT乙级1031】——查验身份证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
思路:
看题知意,按照题目意思模拟一下即可;
代码如下,提交使用g++
#include<bits/stdc++.h>
using namespace std;int main()
{int weight[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};char check[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};int n, count=0, wSum;string id;cin >> n;for(int k=1; k<=n; k++){bool flag = true; //前 17 位是否是数字标记 cin >> id;wSum = 0;for(int i=0; i<=16; i++)//检查计算前17位{if(isdigit(id[i])) //当前位是数字,权值累加 { wSum += (id[i]-'0')*weight[i];}else //否则这个id前17有不是数字的,标记后退出循环 {flag = false;break; }}if(flag) //id前17位是数字,则继续检查校验位 {wSum %= 11;if(check[wSum]==id[17]) {count++; //查验通过,计数器自加; }else{cout << id << endl;}}else{cout << id <<endl;}}if(count==n) printf("All passed"); return 0;
}
【Debug过程】:全部通过的时候,All passed 没有打印出来,随即检查,在程序中是以count(查验通过)的数量是否等于n来做条件的,但是在一开始检查每个id的时候,大循环是用的while(n–),这就导致了最后n必然等于0,从而导致最后判断条件错误;【改用for循环,或者循环之前把n复制一份】
这篇关于【PAT乙级1031】——查验身份证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!