首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将基数-10数字系统中的数字转换为任意数字系统

将基数-10数字系统中的数字转换为任意数字系统
EN

Code Review用户
提问于 2017-03-11 11:47:16
回答 1查看 1K关注 0票数 3

我编写了一个小方法,将数字从基数-10数字系统转换为任何数字系统(代码并不完美,但这不是重点)。我的问题是,我是否有正确的单一责任原则。第二种方法比第一种方法好吗?还是“charReplace”功能太小,无法创建自己的方法?

代码语言:javascript
复制
    public static string convertNumber(BigInteger num, int baseNum)
    {
        string symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        if (baseNum < 2 || symbols.Length + 10 < baseNum)
        {
            throw new Exception;
        }

        var result = "";
        do
        {
            var partResult = (int)(num % baseNum);
            if (partResult >= 10)
            {
                result = result.Insert(0, symbols[partResult - 10].ToString());
            }
            else
            {
                result = result.Insert(0, partResult.ToString());
            }
            num /= baseNum;
        } while (num != 0);

        return result;
    }

代码语言:javascript
复制
    static readonly string Symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    public static string convertNumber(BigInteger num, int baseNum)
    {
        if (baseNum < 2 || Symbols.Length + 10 < baseNum)
        {
            throw new Exception;
        }

        var result = "";
        do
        {
            var partResult = (int)(num % baseNum);
            result = result.Insert(0, charReplace(partResult));
            num /= baseNum;
        } while (num != 0);

        return result;
    }

    private static string charReplace(int number){
        if (number < 10){
            return number.ToString();
        }

        return Symbols[number - 10].ToString();
    }
EN

回答 1

Code Review用户

回答已采纳

发布于 2017-03-11 21:11:49

我相信第一种方法已经足够好了,因为它个人的可读性更强。

小建议

  • 我更喜欢把整个字母表存储在symbols字符串中,而不是只存储字母。这可以简化逻辑。
  • 可以计算输出字符串的结果长度,并避免字符串插入。

总结:

代码语言:javascript
复制
public static string ConvertNumber(BigInteger num, int baseNum)
{
    const string symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    if (baseNum < 2 || symbols.Length < baseNum)
    {
        throw new ArgumentOutOfRangeException(nameof(baseNum));
    }

    if (num < 0)
    {
        throw new ArgumentOutOfRangeException(nameof(num));
    }

    var resultLength = 1 + Math.Max((int)BigInteger.Log(num, baseNum), 0);
    var result = new char[resultLength];
    int index = resultLength - 1;
    do
    {
        result[index--] = symbols[(int)(num % baseNum)];
        num /= baseNum;
    } while (num != 0);

    return new string(result);
}

PS。建议将UpperCamelCase中的所有类和所有方法命名,而不管它们是否公开。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/157512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档