如何获得特定长度的最大数量

And*_*rew 10 c# string optimization long-integer

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

我是这样做的:

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

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

        long maxNumber = long.Parse(maxNumString);
Run Code Online (Sandbox Code Playgroud)

什么是更好,更恰当和更短的方式来完成这项任务?

Cha*_*ana 11

var x = 1234567897865;  
return Math.Pow(10, Math.Ceiling(Math.Log10(x+1e-6))) - 1;
Run Code Online (Sandbox Code Playgroud)

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

即,"我有一个数字,以十六进制表示,例如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
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的.由于`x = 10 ^ n``log(x)`时浮点运算的性质可能略小于n.当发生这种情况时,你的函数返回"10 ^ n-1"而不是"10 ^(n + 1)-1".例如,在双精度算术中,x = 1000得到999而不是9999,因为`log(1000)= 2.99999999999999955591e + 00`. (2认同)

Tud*_*dor 9

long maxNumber = long.Parse(new String('9', ItemNo.ToString().Length));
Run Code Online (Sandbox Code Playgroud)


Ada*_*man 5

尝试这个:

int v = 1;
do {
    v = v * 10;
} while (v <= number);
return v - 1;
Run Code Online (Sandbox Code Playgroud)