記事のディレクトリ
1.トピック
有効なID番号は、17桁のエリア、日付番号、シーケンス番号、およびチェックコードで構成されます。チェックコードの計算規則は次のとおりです。
まず、最初の17桁が重み付けされて合計され、重みの分布は次のようになります。{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4、 2};
次に、計算された合計は11を法として値Zを取得します。最後に、Zの値とチェックコードMの値は次の関係に対応します。
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
入力フォーマット:
最初の行を入力して正の整数を指定しますN(≤100)は入力されたIDカード番号の数です。次のN行では、各行に18桁のID番号が付けられます。
出力フォーマット:
問題のあるID番号を入力順に1行に1つずつ出力します。最初の17桁が妥当かどうかはチェックされませんが、最初の17桁がすべて数字であるかどうかだけがチェックされ、最後の桁のチェックコードが正確に計算されます。すべての数値が正常な場合、渡されたすべてが出力されます。
入力例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
出力サンプル1:
12010X198901011234
110108196711301866
37070419881216001X
入力例2:
2
320124198808240056
110108196711301862
出力サンプル2:
すべて合格
2.アイデアと注意事項
アイデア:
- ブール型の外部関数standard()を定義します。IDカードの最初の16桁が数字かどうかを確認します
- charタイプの外部関数getid()を定義します。この関数は、入力IDの最後の桁に対応する正しいチェックコードを返します。
- 入力中にテストします。IDカードが標準であるかどうか、直接出力されない場合は最初に確認し、標準である場合は最後のチェックコードが正しいかどうかを確認します。
- pass_count変数を使用して、渡されたIDカードの数をカウントします。
- char配列はID情報を格納するために使用されるため、合計すると、arr [i]-'0'であることに注意してください。
定義されている2つの外部関数は次のとおりです。
(1)IDカードの最初の16桁を確認します
bool standard( char arr[] )
{
for(int i=0;i<17;i++)
{
if(0==isdigit(arr[i]))
{
return false;
break;
}
}
return true;
}
(2)IDカードの最後のチェックコードを返す
char getid(char arr[]) //获取最后一位校验码
{
char M[12]={
'1','0','X','9','8','7','6','5','4','3','2'};
int weight[18]={
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int sum=0;
int z=0;
for(int i=0;i<17;i++)
{
sum=sum+(arr[i]-'0')*weight[i]; //arr[i]-'0'返回的才是货真价实的数字
}
z=sum%11;
char temp=M[z];
return temp;
}
3、ACコード
#include<iostream>
#include<cstdio>
using namespace std;
bool standard( char arr[]);
char getid(char arr[]);
int main( )
{
char arr[20];
int pass_count=0; //记录通过的次数
int N;
cin>>N;
for(int i=0;i<N;i++)
{
char temp[20];
scanf("%s",&temp);
if(standard(temp)==true) //检查前16为是否合法
{
if(temp[17]==getid(temp)) //检查最后一位的校验码是否正确
{
pass_count++;
}
else
{
printf("%s\n",temp);
}
}
else
{
printf("%s\n",temp);
}
if(pass_count==N) printf("All passed\n");
}
}
bool standard( char arr[] )
{
for(int i=0;i<17;i++)
{
if(0==isdigit(arr[i]))
{
return false;
break;
}
}
return true;
}
char getid(char arr[]) //获取最后一位校验码
{
char M[12]={
'1','0','X','9','8','7','6','5','4','3','2'};
int weight[18]={
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
int sum=0;
int z=0;
for(int i=0;i<17;i++)
{
sum=sum+(arr[i]-'0')*weight[i];
}
z=sum%11;
char temp=M[z];
return temp;
}
結果: