L1-016 查验身份证 (15 point(s))

  • 之前在PAT乙级也写过,这次写完后看了看,发现自己好像少考虑了一个条件 “检查前17位是否全为数字” 。当时只看到前面的条件 “并不检验前17位是否合理” ,所以就没管写出了下面这个代码。但提交后发现也是可以AC的。

    稍微想了想,这应该是钻了个漏洞的,如果前十七位存在非数字,那么加权求和的时候就可能得不到正确的 Z 值,而无法得到正确的校验码 M。这算误打误撞了。

    PAT (Basic Level) 1031 查验身份证 (15 point(s))

#include <bits/stdc++.h>
using namespace std;

int main(){
	int Pass = 1, N, weight[17]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
	string M = "10X98765432";
	cin >> N;
	
	while(N--){
		string str;
		int Z = 0;
		// 身份证没有空格 用cin 
		cin >> str;
		
		// 计算Z 
		for(int i = 0; i < str.size(); i++)
			Z += (str[i] - '0') * weight[i];
			
		// 判断校验码M 
		if(str[17] != M[Z % 11]){
			Pass = 0;
			cout << str << endl;
		}
	}
	if(Pass) cout << "All passed";
} 

posted on 2021-10-05 06:50  Atl212  阅读(74)  评论(0编辑  收藏  举报

导航