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;
}
相关文章
相关标签/搜索