一、概述
给出一个身份证号码,判断是否符合规定。
很简单的一道题,避过坑,使用两个数组和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";
}