PAT (Basic Level) Practice 1031 查验身份证

一、概述

给出一个身份证号码,判断是否符合规定。

很简单的一道题,避过坑,使用两个数组和cin,cout,十分钟就可以写完。测试点的坑有两个:

X是大写;

不符合规定的号码里的元素可能有除了0~9和X以外的字符。

二、分析

对于此类字符各位一一对应类问题,采用开数个数组的方式效率最高。

身份证号很长,用数组存储太笨重了,极力推荐string。

开两个数组,权值数组以及转换数组。

int mult[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char tran[11] = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

注意转换数组应为“X”而不是“x”。

判断是否是数字时按如下方式

int valid = 1;
for (j = 0; j < 17; j++)
{
	if (j < 16 && (number[j]>57 || number[j]<48))
	{
		valid = 0;
		break;
	}
	sum += (number[j] - 48) * mult[j];
}

string中的单个元素是用ASCII码存储的,因此对于数组要减48。

三、总结

尝到了string和cincout的甜头。对于大小写一定要注意。

PS:代码如下

#include<stdio.h>
#include<string>
#include<iostream>

using namespace std;

int mult[17] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };
char tran[11] = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

int main()
{
	int count;
	cin >> count;
	string number;
	int i;
	int validsum = 0;
	for (i = 0; i < count; i++)
	{
		cin >> number;
		int j;
		int sum = 0;
		int valid = 1;
		for (j = 0; j < 17; j++)
		{
			if (j < 16 && (number[j]>57 || number[j]<48))
			{
				valid = 0;
				break;
			}
			sum += (number[j] - 48) * mult[j];
		}
		if (tran[sum % 11] != number[17])
			valid = 0;
		if (valid == 0)
			cout << number << "\n";
		else
			validsum++;
	}
	if (validsum == count)
		cout << "All passed";
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值