a054: 電話客服中心

2022.11.29 PM 07:00 by CBJ

來源 : https://zerojudge.tw/ShowProblem?problemid=a054
出題者 : snail蝸牛
標籤 : 查表、流程控制
難易度 : 2
解題想法 : 
首先先對每個英文字母建表,A為10, B為11 ... 以此類推。

實作上可定義一個函式check(s),用於計算當身分證號為s的時候,是否合法。並使用一個for i從A判斷到Z,每次check(t),其中t為當大寫字母為i時的身分證號。只要check成功則輸出i。

再來就是實作check()的部分 :
題目提到的計算方式為
1. ans = (第0位*1 + 第1位*9 + 第2位*8 ... 第8位*2 + 第9位*1)。
2. x = 10 - (ans % 10)。
假如x為10,則記得將x改為0,若最終的x等於第10位則合法。

首先可以觀察到,除了第0位*1比較特殊外,其他的都滿足 -> 第i位*(10-i) 的公式,因此我們可以一開始就將ans設為第0位*1(也就是第0位),再來就可以跑一個for i從1~9,並將ans += 第i位*(10-i),得到ans後即可計算x,得到x以後即可判斷是否合法,若合法則return 1(true),否則return 0(false)。

※若NA(85%)則可能是忘記將10歸回0。
//C language

#include<stdio.h>
#include<string.h>
char* d['Z'+1];
void init(){
    d['A']="10";d['B']="11";d['C']="12";d['D']="13";d['E']="14";
    d['F']="15";d['G']="16";d['H']="17";d['I']="34";d['J']="18";
    d['K']="19";d['L']="20";d['M']="21";d['N']="22";d['O']="35";
    d['P']="23";d['Q']="24";d['R']="25";d['S']="26";d['T']="27";
    d['U']="28";d['V']="29";d['W']="32";d['X']="30";d['Y']="31";
    d['Z']="33";
}
int to_int(char c){
    return c-'0';
}
int check(char t[500]){
    int ans=to_int(t[0]);
    for(int i=1;i<10;i++){
        ans+=to_int(t[i])*(10-i);
    }
    int x=(10-ans%10 != 10)?(10-ans%10):0;
    return (x == to_int(t[10]));
}
int main(){
    init();
    char s[200];
    scanf("%s",s);
    for(int i='A';i<=(int)'Z';i++){
        char t[500]={};
        strcat(t,d[i]);
        strcat(t,s);
        if(check(t)){
            printf("%c",i);
        }
    }
    printf("\n");
    return 0;
}
//C++ language

#include<iostream>
#include<map>
#include<string>
using namespace std;
map<char,string>d;
void init(){
    d['A']="10";d['B']="11";d['C']="12";d['D']="13";d['E']="14";
    d['F']="15";d['G']="16";d['H']="17";d['I']="34";d['J']="18";
    d['K']="19";d['L']="20";d['M']="21";d['N']="22";d['O']="35";
    d['P']="23";d['Q']="24";d['R']="25";d['S']="26";d['T']="27";
    d['U']="28";d['V']="29";d['W']="32";d['X']="30";d['Y']="31";
    d['Z']="33";
}
string s;
int to_int(char c){
    return c-'0';
}
bool check(string t){
    int ans=to_int(t[0]);
    for(int i=1;i<10;i++){
        ans+=to_int(t[i])*(10-i);
    }
    int x=(10-ans%10 != 10)?(10-ans%10):0;
    return (x == to_int(t[t.size()-1]));
}
int main(){
    init();
    cin>>s;
    for(char i:"ABCDEFGHIJKLMNOPQRSTUVWXYZ"){
        if(check(d[i]+s)){
            cout<<i;
        }
    }
    cout<<"\n";
    return 0;
}
## Python language

d={'A':'10','B':'11','C':'12','D':'13','E':'14',\
   'F':'15','G':'16','H':'17','I':'34','J':'18',\
   'K':'19','L':'20','M':'21','N':'22','O':'35',\
   'P':'23','Q':'24','R':'25','S':'26','T':'27',\
   'U':'28','V':'29','W':'32','X':'30','Y':'31',\
   'Z':'33'}
s=input()

def check(t):
    ans=int(t[0])
    for i in range(1,10):
        ans+=int(t[i])*(10-i)
    x=(10-ans%10) if (10-ans%10)!=10 else 0
    return (x == int(t[-1]))
    
for i in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
    if check(d[i]+s):
        print(i,end='')
print()

相關文章