a020: 身分證檢驗

2022.12.06 PM 09:30 by CBJ

來源 : https://zerojudge.tw/ShowProblem?problemid=a020
出題者 : jiangsir
標籤 : 迴圈、字元處理、條件判斷
難易度 : 1
解題想法 : 
此題和「a054: 電話客服中心」類似,詳細作法可參考此篇題解,重複的部分便不再贅述。(https://cbjsprogramdiary.com/2022/11/29/a054-%e9%9b%bb%e8%a9%b1%e5%ae%a2%e6%9c%8d%e4%b8%ad%e5%bf%83/)

和a054不同之處在於,我們這次直接算好每個字母對應的兩位數該轉成的數值,例如A=10,就先算好(1*1)+(0*9)=1,故d['A']=1,以此類推。

其餘實作部分建議可參考a054。(若了解實作原理,基本上可以一次解決掉此題和a054。)
//C language

#include<stdio.h>
int d['Z'+1];
char s[11];
void init(){
    d['A']=1; d['B']=10; d['C']=19; d['D']=28; d['E']=37;
    d['F']=46; d['G']=55; d['H']=64; d['I']=39; d['J']=73;
    d['K']=82; d['L']=2; d['M']=11; d['N']=20; d['O']=48;
    d['P']=29; d['Q']=38; d['R']=47; d['S']=56; d['T']=65;
    d['U']=74;d['V']=83;d['W']=21;d['X']=3;d['Y']=12;
    d['Z']=30;
    scanf("%s",s);
}
int to_int(char c){
    return c-'0';
}
int legal(){
    int ans=d[s[0]];
    for(int i=1;i<9;i++){
        ans+=to_int(s[i])*(9-i);
    }
    return (ans+to_int(s[9]))%10 == 0;
}
int main(){
    init();
    printf("%s",legal()?"real\n":"fake\n");
    return 0;
}
//C++ language

#include<iostream>
#include<map>  //map 
#include<string> //string 
using namespace std;
map<char,int>d;
string s;
void init(){
    d['A']=1; d['B']=10; d['C']=19; d['D']=28; d['E']=37;
    d['F']=46; d['G']=55; d['H']=64; d['I']=39; d['J']=73;
    d['K']=82; d['L']=2; d['M']=11; d['N']=20; d['O']=48;
    d['P']=29; d['Q']=38; d['R']=47; d['S']=56; d['T']=65;
    d['U']=74;d['V']=83;d['W']=21;d['X']=3;d['Y']=12;
    d['Z']=30;
    cin>>s;
}
int to_int(char c){
    return c-'0';
}
bool legal(){
    int ans=d[s[0]];
    for(int i=1;i<9;i++){
        ans+=to_int(s[i])*(9-i);
    }
    return (ans+to_int(s[9]))%10==0;
}
int main(){
    init();
    string result[2]={"fake\n","real\n"};
    cout<<result[ legal() ]; //legal return 0 or 1
    return 0;
}
## Python language

d={'A':1,'B':10,'C':19,'D':28,'E':37,\
   'F':46,'G':55,'H':64,'I':39,'J':73,\
   'K':82,'L':2,'M':11,'N':20,'O':48,\
   'P':29,'Q':38,'R':47,'S':56,'T':65,\
   'U':74,'V':83,'W':21,'X':3,'Y':12,\
   'Z':30}
def legal(s):
    ans=d[s[0]]
    for i in range(1,9):
        ans+=int(s[i])*(9-i)
    return (ans+int(s[-1]))%10 == 0
print(('real' if legal(input()) else 'fake'))

相關文章