# String Manipulation# Math# Conditional Statements

a020 - 身分證檢驗

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷輸入的身分證字號是否為有效字號。有效性依據題目提供的規則進行驗算,主要包含將英文代號轉換為數字、計算加權和,並檢查最終和是否能被 10 整除。

解題思路

程式碼首先讀取身分證字號字串。然後,根據字號的第一個字元(英文代號),將其轉換為對應的數字。接著,計算加權和,具體步驟如下:

  1. 將英文代號轉換後的數字,個位數乘以 9 再加上十位數的數字。
  2. 將字號後續的數字,從右到左依次乘以 1 到 8。
  3. 將上述計算結果以及字號的最後一個數字相加。
  4. 最後,檢查總和是否能被 10 整除,如果能被整除,則輸出 "real",否則輸出 "fake"。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

#include <iostream>
#include <string>

using namespace std;

int main (){
	
	string ID;
	int sum=0,p=0;
	while(cin >> ID){
		if(65<=ID[0]&&72>=ID[0]){
			sum+=ID[0]-55;
		}
		else if(ID[0]==73){
			sum+=ID[0]-39;
		}
		else if(74<=ID[0]&&78>=ID[0]){
			sum+=ID[0]-56;
		}
		else if(ID[0]==79){
			sum+=ID[0]-44;
		}
		else if(80<=ID[0]&&86>=ID[0]){
			sum+=ID[0]-57;
		}
		else if(ID[0]==87){
			sum+=ID[0]-55;
		}
		else if(88<=ID[0]&&89>=ID[0]){
			sum+=ID[0]-58;
		}
		else if(ID[0]==90){
			sum+=33;
		}
		p=sum%10;
		p*=9;
		sum/=10;
		sum+=p;
		int k=9;
		for(int i=1;i<=8;i++){
			k--;
			sum+=(ID[i]-48)*k;
		}
		sum+=ID[9]-48;
		if(sum%10==0){
			cout << "real" << endl; 
		}
		else{
			cout << "fake" << endl;
		}
		sum=0;	
	}
	
}

Discussion