PAT-B:1031 ID検証(15ポイント)



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.アイデアと注意事項

アイデア:

  1. ブール型の外部関数standard()を定義します。IDカードの最初の16桁が数字かどうかを確認します
  2. charタイプの外部関数getid()を定義します。この関数は、入力IDの最後の桁に対応する正しいチェックコードを返します。
  3. 入力中にテストします。IDカードが標準であるかどうか、直接出力されない場合は最初に確認し、標準である場合は最後のチェックコードが正しいかどうかを確認します。
  4. pass_count変数を使用して、渡されたIDカードの数をカウントします。
  5. 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;
}


結果:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/SKMIT/article/details/113917505