2012-03-28 111 views
10

我有一個數字,例如1234567897865;我如何最大限度地創建99999999999999?如何獲得特定長度的最大數量

我這樣做是這樣的:

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

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

     long maxNumber = long.Parse(maxNumString); 

這將是解決這個任務的更好的,適當的和更短的方法是什麼?

回答

11
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 
+0

如果您超過「長」,BigInteger具有可比較的方法。 – 2012-03-28 21:24:02

+2

這是不正確的。由於浮點運算的特性,當x = 10^n'' log(x)'可能略小於n時。當發生這種情況時,你的函數返回'10^n-1'而不是'10 ^(n + 1)-1'。例如,在雙精度算術中,x = 1000會給出999而不是9999,因爲log(1000)= 2.99999999999999955591e + 00'。 – 2012-03-28 21:46:50

+0

啊......挑剔! [但是正確]。我固定處理這個... @adam,爲什麼只是建議/提供修復自己? – 2012-03-28 23:12:39

9
long maxNumber = long.Parse(new String('9', ItemNo.ToString().Length)); 
+1

就像你的答案比接受更好。當CPU可以做時,爲什麼還要爲FPU打擾。比浮點更具可預測性,減少測試頭痛。有助於節省一些電量 – 2012-03-29 02:36:25

1
int numDigits = (int)Math.Ceiling(Math.Log10(number)); 
int result = (int)(Math.Pow(10, numDigits) - 1) 

我沒有可用的時刻編譯器,所以一些額外的字符串/雙轉換可能需要在這裏發生。

4

試試這個:

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