1.2 Name That Number

     這是一個相似於查字典的問題。已知一本「字典」中包含了一些英文單詞(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;
}
相關文章
相關標籤/搜索