a020 - 身分證檢驗
題目描述
題目要求判斷輸入的身分證字號是否為有效字號。有效性依據題目提供的規則進行驗算,主要包含將英文代號轉換為數字、計算加權和,並檢查最終和是否能被 10 整除。
解題思路
程式碼首先讀取身分證字號字串。然後,根據字號的第一個字元(英文代號),將其轉換為對應的數字。接著,計算加權和,具體步驟如下:
- 將英文代號轉換後的數字,個位數乘以 9 再加上十位數的數字。
- 將字號後續的數字,從右到左依次乘以 1 到 8。
- 將上述計算結果以及字號的最後一個數字相加。
- 最後,檢查總和是否能被 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;
}
}