• 欢迎访问一起聊聊,欢迎加入一起聊聊 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏一起聊聊吧

一个大数字符串从M进制转换成N进制

程序教程 admin 2022-04-08 18:06:54 1548次 0条 未收录
    /// <summary>
    /// 将一个大数字符串从M进制转换成N进制  
    /// </summary>
    /// <param name="sourceValue">M进制数字字符串</param>
    /// <param name="sourceBaseChars">M进制字符集</param>
    /// <param name="newBaseChars">N进制字符集</param>
    /// <returns>N进制数字字符串</returns>
    public static string BaseConvert(string sourceValue, string sourceBaseChars, string newBaseChars)
    {
        //M进制
        int sBase = sourceBaseChars.Length;
        //N进制
        int tBase = newBaseChars.Length;
        //M进制数字字符串合法性判断(判断M进制数字字符串中是否有不包含在M进制字符集中的字符)
        if (sourceValue.Any(s => !sourceBaseChars.Contains(s))) return null;
        //将M进制数字字符串的每一位字符转为十进制数字依次存入到LIST中
        List<int> intSource = new List<int>();
        intSource.AddRange(sourceValue.Select(c => sourceBaseChars.IndexOf(c)));
        //余数列表
        List<int> res = new List<int>();
        //开始转换(判断十进制LIST是否为空或只剩一位且这个数字小于N进制
        while (!((intSource.Count == 1 && intSource[0] < tBase) || intSource.Count == 0))
        {
            //每一轮的商值集合
            List<int> ans = new List<int>();
            int y = 0;
            //十进制LIST中的数字逐一除以N进制(注意:需要加上上一位计算后的余数乘以M进制)
            foreach (int t in intSource)
            {
                //当前位的数值加上上一位计算后的余数乘以M进制
                y = y * sBase + t;
                //保存当前位与N进制的商值
                ans.Add(y / tBase);
                //计算余值
                y %= tBase;
            }
            //将此轮的余数添加到余数列表
            res.Add(y);
            //将此轮的商值(去除0开头的数字)存入十进制LIST做为下一轮的被除数
            bool flag = false;
            intSource.Clear();
            foreach (int a in ans.Where(a => a != 0 || flag))
            {
                flag = true;
                intSource.Add(a);
            }
        }
        //如果十进制LIST还有数字,需将此数字添加到余数列表后
        if (intSource.Count > 0) res.Add(intSource[0]);
        //将余数列表反转,并逐位转换为N进制字符
        string nValue = string.Empty;
        for (int i = res.Count - 1; i >= 0; i--)
        {
            nValue += newBaseChars[res[i]];
        }
        return nValue;
    }

一起聊聊 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:一个大数字符串从M进制转换成N进制
喜欢 (5)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址