這是一個相似於查字典的問題。已知一本「字典」中包含了一些英文單詞(5000個左右,單詞長度爲1~12位),又已知一種對應關係,數字2~9共對應除去Q和Z的24個英文字母,每一個數字可對應3個英文字母,如2可對應A,B,C,也就是說A,B,C都可用2表示。那給你一個n位的數字,這個數字能夠表示的單詞就有3^n種。現題目給定一個1~12位長的數字,要求輸出在字典中存在的這個數字所對應成的全部單詞。數組
因爲字典中包含的單詞數量很少,咱們能夠先將單詞讀入內存,而後一一比較。但這種作法確定不是最好的,若是單詞的個數不少的話,那確定花的時間會增大,這種方法必須把每一個字典裏的每一個單詞都比較一次。函數
想到用哈希查找的方法,能夠以數字爲關鍵字key,f=key%5000做爲哈希函數,定義數組arr[5000],將關鍵字爲key的單詞全都存到以arr[f]爲頭結點的鏈表中,這樣的話每次查詢均可以直接定址到key%5000,大大減小查詢時間。寫了很久,最後終於經過了。spa
/* ID: whutzha1 PROG: namenum LANG: C++ */ #include<fstream> using namespace std; ifstream cin("namenum.in"); ifstream fin("dict.txt"); ofstream cout("namenum.out"); struct Node { char name[13]; long long num; Node *next; }; int main() { Node *arr[5000]; int i; for (i=0;i<5000;i++) { arr[i]=NULL; } //讀dict.txt文件 char read_name[13]; long long read_num; int area; int n; char ch; while(fin.get(ch)) { for (i=0;i<13;i++) { while(ch==' '||ch=='\n') { fin.get(ch); } read_name[i]=ch; fin.get(ch); if (ch==' '||ch=='\n') break; } read_name[i+1]='\0'; read_num=0; for(i=0;i<12;i++) { switch(read_name[i]) { case 'A': case 'B': case 'C': n=2;break; case 'D': case 'E': case 'F': n=3;break; case 'G': case 'H': case 'I': n=4;break; case 'J': case 'K': case 'L': n=5;break; case 'M': case 'N': case 'O': n=6;break; case 'P': case 'R': case 'S': n=7;break; case 'T': case 'U': case 'V': n=8;break; case 'W': case 'X': case 'Y': n=9;break; default: break; } read_num=(read_num*10+n); if (i==11||read_name[i+1]=='\0') { area=read_num%5000; Node *p=(Node *)malloc(sizeof(Node)); if (arr[area]==NULL) { arr[area]=p; } else { Node *q=arr[area]; Node *r; while (q) { r=q; q=q->next; } r->next=p; } p->num=read_num; p->next=NULL; for (i=0;i<13;i++) { p->name[i]=read_name[i]; if (p->name[i]=='\0') { break; } } break; } } }//while long long num; bool flag; cin>>num; Node *p; p=arr[num%5000]; flag=false; while(p) { if (p->num==num) { flag=true; // for(i=0;i<12;i++) // { // cout<<p->name[i]; // if (p->name[i+1]=='\0') // {cout<<endl;break;} // } cout<<p->name<<endl; } p=p->next; } if (!flag) {cout<<"NONE"<<endl;} return 0; }