用C#实现五笔编码

 五笔的编码范围是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进制的数,这样就好处理了

猜你喜欢

转载自blog.csdn.net/weixin_42446849/article/details/81230750