题意:跟题目一样,就是给一个字符串,构造一个完美的HASH函数,其中这个HASH函数的算法已经给出了,题目要求C值。
思路:1.gets读取字符串,注意单词间可能有多个空格
2.算出每个单词的权值
3.根据题目中的算法,写出循环,求出C,再根据题目要求输出即可。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
char word[15][6];
char origin[1000];
int weight[15];
int num,min,C;
void GetWeight()
{
memset(weight,0,sizeof(weight));
min=2147483647;
int i,j,k,v;
for(i=0;i<num;i++)
{
v=0;
for(j=0;j<strlen(word[i]);j++)
{
v=v*32+(word[i][j]-'a'+1);
}
if(v<min)min=v;
weight[i]=v;
}
}
int minValue(int a,int b)
{
return a<b?a:b;
}
int GetC()
{
int i,j,k;
int ci,cj,flag;
C=min;
while(1)
{
flag=0;
for(i=0;i<num-1;i++)
{
ci=C/weight[i];
for(j=i+1;j<num;j++)
{
cj=C/weight[j];
if(ci%num==cj%num)
{
C=minValue((ci+1)*weight[i],(cj+1)*weight[j]);
flag=1;
}
}
}
if(!flag)break;
}
}
int main()
{
int i,j,k;
while(gets(origin)!=NULL)
{
memset(word,0,sizeof(word));
j=k=0;
for(i=0;i<strlen(origin);i++,k++)
{
if(isalpha(origin[i]))word[j][k]=origin[i];
if(origin[i]==' '&&isalpha(origin[i+1]))
{
j++;
k=-1;
}
}
num=j+1;
puts(origin);
GetWeight();
GetC();
printf("%d\n",C);
printf("\n");
}
return 0;
}