【问题标题】:How to get the maximum number of a particular length如何获得特定长度的最大数量
【发布时间】:2012-04-12 12:39:00
【问题描述】:

我有一个号码,例如 1234567897865;如何最大化它并创建 99999999999999?

我是这样做的:

        int len = ItemNo.ToString().Length;
        String maxNumString = "";

        for (int i = 0; i < len; i++)
        {
            maxNumString += "9";
        }

        long maxNumber = long.Parse(maxNumString);

完成这项任务的更好、正确和更短的方法是什么?

【问题讨论】:

    标签: c# string optimization long-integer


    【解决方案1】:
    var x = 1234567897865;  
    return Math.Pow(10, Math.Ceiling(Math.Log10(x+1e-6))) - 1;
    

    为了扩展下面的 cmets,如果这个问题用十六进制或二进制表示,可以使用移位运算符非常简单地完成

    即,“我有一个十六进制数字,例如 3A67FD5C;如何将其最大化并创建 FFFFFFFF?”

    我必须使用它来确保它正常工作,但它会是这样的:

    var x = 0x3A67FD5C;  
    var p = 0;
    while((x=x>>1)>0) p++;          // count how many binary values are in the number
      return (1L << 4*(1+p/4)) - 1; // using left shift, generate 2 to 
                                    // that power and subtract one
    

    【讨论】:

    • BigInteger 有类似的方法,如果你长大了long
    • 这是不正确的。由于浮点运算的特性,x=10^n log(x) 可能略小于 n。发生这种情况时,您的函数将返回 10^n-1 而不是 10^(n+1)-1。例如,在双精度算术中,x=1000 给出 999 而不是 9999,因为 log(1000) = 2.99999999999999955591e+00
    • 啊……挑剔! [但正确]。我解决了这个问题...@adam,为什么只是自己建议/提供修复??
    • @CharlesBretana 是的,这应该可以解决它。
    • @CharlesBretana 我没有编辑这篇文章,因为我认为首先使用浮点来解决这个问题并不是很漂亮。 1e-6 的修复让它变得更加丑陋。
    【解决方案2】:
    long maxNumber = long.Parse(new String('9', ItemNo.ToString().Length));
    

    【讨论】:

    • 喜欢你的答案胜过接受的答案。当 CPU 可以做到时,为什么还要打扰 FPU。比浮点更可预测,更少的测试头痛。也有助于节省一些电力
    【解决方案3】:

    试试这个:

    int v = 1;
    do {
        v = v * 10;
    } while (v <= number);
    return v - 1;
    

    【讨论】:

      【解决方案4】:
      int numDigits = (int)Math.Ceiling(Math.Log10(number));
      int result = (int)(Math.Pow(10, numDigits) - 1)
      

      我目前没有可用的编译器,因此这里可能需要进行一些额外的字符串/双精度转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        • 2019-10-22
        • 1970-01-01
        相关资源
        最近更新 更多