Как получить максимальное количество определенной длины - PullRequest
10 голосов
/ 29 марта 2012

У меня есть номер, например, 1234567897865; как мне его максимально увеличить и создать 99999999999999?

Я так и сделал:

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

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

        long maxNumber = long.Parse(maxNumString);

каков будет лучший, правильный и короткий способ решения этой задачи?

Ответы [ 4 ]

11 голосов
/ 29 марта 2012
var x = 1234567897865;  
return Math.Pow(10, Math.Ceiling(Math.Log10(x+1e-6))) - 1;

Чтобы расширить комментарии ниже, если бы эта проблема была выражена в шестнадцатеричном или двоичном виде, это можно было бы сделать очень просто, используя операторы смещения

Т.е., "у меня есть число в шестнадцатеричном виде, например, 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
9 голосов
/ 29 марта 2012
long maxNumber = long.Parse(new String('9', ItemNo.ToString().Length));
4 голосов
/ 29 марта 2012

Попробуйте это:

int v = 1;
do {
    v = v * 10;
} while (v <= number);
return v - 1;
1 голос
/ 29 марта 2012
int numDigits = (int)Math.Ceiling(Math.Log10(number));
int result = (int)(Math.Pow(10, numDigits) - 1)

В данный момент у меня нет доступного компилятора, поэтому здесь могут потребоваться дополнительные преобразования строки / двойного преобразования.

...