2012-03-28 9 views
10

Mam numer, na przykład 1234567897865; jak mam go zmaksymalizować i utworzyć 99999999999999?Jak uzyskać maksymalną liczbę określonej długości

Zrobiłem to w ten sposób:

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

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

     long maxNumber = long.Parse(maxNumString); 

co byłoby lepiej, prawidłowe i krótszy sposób podejść do tego zadania?

Odpowiedz

11
var x = 1234567897865; 
return Math.Pow(10, Math.Ceiling(Math.Log10(x+1e-6))) - 1; 

Aby rozwinąć na komentarze poniżej, jeśli problem ten został wyrażony w szesnastkowym lub binarnym, to można zrobić w bardzo prosty sposób za pomocą operatorów shift

czyli „Mam kilka, w hex, , na przykład 3A67FD5C, jak mogę go maksymalnie zwiększyć i utworzyć FFFFFFFF? "

musiałbym grać z tym, aby upewnić się, że działa dokładnie tak, ale byłoby to coś takiego:

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 ma podobne metody, jeśli przerastasz 'long'. –

+2

To jest nieprawidłowe. Ze względu na właściwości arytmetyki zmiennoprzecinkowej, gdy 'x = 10^n'' log (x) 'może być nieco mniejsze niż n. Kiedy tak się stanie twoja funkcja zwraca '10^n-1' zamiast' 10^(n + 1) -1'. Na przykład w arytmetyce podwójnej precyzji x = 1000 daje 999 zamiast 9999, ponieważ 'log (1000) = 2.99999999999999955591e + 00'. –

+0

ahhh .... wybredny! [ale poprawne]. Naprawiłem to ... @adam, dlaczego po prostu zasugeruj/zapewnij sobie naprawę? –

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

jak odpowiedź lepszą niż przyjęta jeden. Po co zawracać sobie głowę jednostkami FPU, kiedy może to zrobić procesor. Bardziej przewidywalny niż zmiennoprzecinkowy, mniej testujący ból głowy. Pomaga także zaoszczędzić trochę energii elektrycznej. –

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

nie mam kompilatora dostępne w tej chwili, więc Konieczne może się tu zdarzyć kilka dodatkowych konwersji ciągów/podwójnych.

4

Spróbuj tego:

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