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()
