五笔的编码范围是a到y的25个字母,从1位到4位的编码,
如果将五笔的编码按字典序排序,形成数组如下:a, aa, aaa, aaaa, aaab, aaac, ..., b, ba, baa, baaa, baab...yyyx, yyyy
其中a的索引是0,aa的索引是1,aaa的索引是2,aaaa的索引是3,以此类推:
1)、编写一个函数,输入是任意一个合法的字符串,输出这个字符串对应的索引;
2)、编写一个函数,输入是任意一个合法的索引,输出这个索引对应的字符串。
代码:
/// <summary>
/// 根据值返回该值所对应的索引
/// </summary>
/// <param name="value">值</param>
/// <returns>值所对应的索引</returns>
public int GetIndex(string value)
{
int index = 0;
if (value.Length==4)
{
index = (value[0] - 'a') * 25 * 25 * 25 + (value[1] - 'a') * 25 * 25 + (value[2] - 'a') * 25 + (value[3] - 'a')+ (value[0] - 'a'+1)*3;
}
else
{
index = (value[0] - 'a') * 25 * 25 * 25 + 3* (value[0] - 'a')+value.Length-1;
}
return index;
}
/// <summary>
/// 根据索引查询值并返回
/// </summary>
/// <param name="index">索引</param>
/// <returns>索引所对应的值</returns>
public string GetValue(int index)
{
string value = "";
if (index==2)
{
return value = "aaa";
}
if (index==1)
{
return value = "aa";
}
if (index==0)
{
return value = "a";
}
if(index%15627<=3&&index%15627>0)
{
char a = (char)(index / 15627+97);
int b = index % 15627;
switch (b)
{
case 1:
value = a.ToString();
break;
case 2:
value = a.ToString() + a.ToString();
break;
case 3:
value= a.ToString() + a.ToString() + a.ToString();
break;
default:
break;
}
return value;
}
int newIndex = index - (index / 15627+1) * 3;
char qWei = (char)(newIndex / (25 * 25 * 25)+97);
char bWei = (char)((newIndex - (qWei-97) * 25 * 25 * 25) / (25 * 25)+97);
Console.WriteLine((newIndex - (qWei - 97) * 25 * 25 * 25) / (25 * 25) + 97);
char sWei = (char)((newIndex - (qWei-97) * 25 * 25 * 25 - (bWei-97) * 25 * 25) / 25+97);
char gWei = (char)(newIndex % 25+97);
value = qWei.ToString() + bWei.ToString() + sWei.ToString() + gWei.ToString();
return value;
}
思路是将长度为4的值和小于4的分别处理,长度为4的值将a当成0,b为1,c为2...y为24,所以可以看出长度为4的这些值其实是一个25进制的数,这样就好处理了