原文题目描述
思路分析
这么简单的题写了这么久。。。我怕不是有点智障
- 因为要判断是否全部符合,所以要用
count
统计符合的个数,这里把判断是否为身份证的功能封装成函数isID
- 重头戏就是怎么写这个函数了。
- 由于输入时用字符串类型,所以要转化成数字类型,同时判断是否为数字,如果不是数字直接
return
掉,如果是数字,则转化为int
类型。- 再根据加权的到
z
,这里M
里的x
不好处理,所以统一成数据,改成数字10
,然后在判断比较。- 这里用
return true
来判断 表示 不是合格的身份证序列,还是合格都一样,主函数里的判断语句改掉就好了。
代码思路
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int quan[20] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int M[15] = {1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2};
bool isID(string ID)
{
int id[20];
for(int i = 0 ; i < 17 ; i++ )
{
if(ID[i] <= '9' && ID[i] >= '0')
{
//检查前17位是否都是数字
id[i] = ID[i] - '0';
}
else
{
cout << ID << endl;
return false;
break;
}
}
//计算z值判断是否合理
int z=0;
for(int i = 0; i < 17 ; i++)
z += id[i]*quan[i];
z = z % 11;
id[17] = (ID[17] == 'X') ? 10 : (ID[17] - '0');
if(id[17] != M[z])
{
cout << ID << endl;
return true;
}
return false;
}
int main()
{
int N, count=0;;
cin >> N;
for(int i = 0; i < N ; i++)
{
string ID;
cin >> ID;
if( isID(ID) )
{
count++;
}
if( count == 0)
{
cout << "All passed";
}
return 0;
}
}
唉 还是太垃圾了了