2009-02-16 45 views
33

我擔心這個問題有一個簡單而明顯的答案。我需要確定項目的數量是多少個數字,以便我可以填充每個項目編號,並使用最小值維持對齊所需的前導零數。例如,如果總數爲< 10,則不需要前導零;如果數量在10和99之間,則不需要前導零。如何計算不帶字符串轉換的整數中的數字?

一種解決方案是將項目數轉換爲字符串,然後對字符進行計數。呸!有沒有更好的辦法?

編輯:我不會想到使用common logarithm(我不知道這樣的東西存在)。所以,對我來說並不明顯 - 但絕對簡單。

+1

雖然對數解決方案獲得最多選票,在我看來,字符串轉換(其中,奇怪的是,提出只有一次)是更好的一個。它完全反映了你的意圖,並且你有可能寫出一個通用組件來處理任何類型的項目(不僅僅是數字)。 – 2012-07-03 17:40:01

回答

51

這應該做到這一點:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1; 
+0

他說這是算數。這意味着該域名超過了自然數字,不是嗎?所以不需要負面檢查。 – 2009-02-16 21:23:38

+1

我上次檢查時,數字零有一個數字,而不是零。所以不應該數字== 0意味着長度= 1? – 2009-02-16 22:31:01

+0

大聲笑。咄。修復。 – 2009-02-16 23:15:44

0

一種解決方案是通過基座10的對數,比特矯枉過正提供。

4

您可以使用while循環,它可能會比對數快,因爲這僅使用整數運算:

int len = 0; 
while (n > 0) { 
    len++; 
    n /= 10; 
} 

我把它作爲一個練習留給讀者來調整這個算法來處理零和負數。

+0

這是一個很好的折衷。一個「半心半意的日誌(n)」。這將比轉換爲字符串更有效率,因爲轉換將其用作其算法的一部分。 – gbarry 2009-02-16 21:04:35

+0

fyl2x只有20-100個週期。 div大約需要40個,所以它只會在3-4個數字的情況下才會有這個算法存在慢於日誌的風險。在最好的情況下,日誌比通過這個循環的一步更快... – jheriko 2009-02-17 03:56:21

0

你可以循環和刪除10,統計你循環的次數;

int num = 423; 
int minimum = 1; 
while (num > 10) { 
    num = num/10; 
    minimum++; 
} 
12
int length = (int)Math.Log10(Math.Abs(number)) + 1; 

您可能需要考慮負號..

4

如果你要墊在.NET中的號碼,然後

num.ToString().PadLeft(10, '0') 

可能做你想要什麼。

1

由於數字沒有前導零,因此無論如何都要進行轉換以添加它們。我不知道爲什麼你努力避免找到最終結果必須是字符串的長度。

0

好的,我無法抗拒:使用/=

#include <stdio.h> 

int 
main(){ 
     int num = 423; 
     int count = 1; 
     while(num /= 10) 
       count ++; 
     printf("Count: %d\n", count); 
     return 0; 
} 
534 $ gcc count.c && ./a.out 
Count: 3 
535 $ 
11

比重複分裂一種更有效的解決方案將被重複如果與乘法...例如語句(其中n是需要的位數,其數目的數目)

unsigned int test = 1; 
unsigned int digits = 0; 
while (n >= test) 
{ 
    ++digits; 
    test *= 10; 
} 

如果有一些合理的上關於該項目計數(例如一個unsigned int的32位範圍)結合,然後甚至更好的方法是將比較一些靜態數組的成員,例如

// this covers the whole range of 32-bit unsigned values 
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; 

unsigned int digits = 10; 
while(n < test[digits]) --digits; 
2

我會發表評論,但我的代表不會給予我這種區別。

所有我想指出的是,即使Log(10)是一個非常優雅的(只有幾行代碼)解決方案,但它可能是處理器上最重要的一個。

我認爲jherico的答案可能是最有效的解決方案,因此應該如此獎勵。

特別是如果你打算做這一個批號的..