我擔心這個問題有一個簡單而明顯的答案。我需要確定項目的數量是多少個數字,以便我可以填充每個項目編號,並使用最小值維持對齊所需的前導零數。例如,如果總數爲< 10,則不需要前導零;如果數量在10和99之間,則不需要前導零。如何計算不帶字符串轉換的整數中的數字?
一種解決方案是將項目數轉換爲字符串,然後對字符進行計數。呸!有沒有更好的辦法?
編輯:我不會想到使用common logarithm(我不知道這樣的東西存在)。所以,對我來說並不明顯 - 但絕對簡單。
我擔心這個問題有一個簡單而明顯的答案。我需要確定項目的數量是多少個數字,以便我可以填充每個項目編號,並使用最小值維持對齊所需的前導零數。例如,如果總數爲< 10,則不需要前導零;如果數量在10和99之間,則不需要前導零。如何計算不帶字符串轉換的整數中的數字?
一種解決方案是將項目數轉換爲字符串,然後對字符進行計數。呸!有沒有更好的辦法?
編輯:我不會想到使用common logarithm(我不知道這樣的東西存在)。所以,對我來說並不明顯 - 但絕對簡單。
這應該做到這一點:
int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
他說這是算數。這意味着該域名超過了自然數字,不是嗎?所以不需要負面檢查。 – 2009-02-16 21:23:38
我上次檢查時,數字零有一個數字,而不是零。所以不應該數字== 0意味着長度= 1? – 2009-02-16 22:31:01
大聲笑。咄。修復。 – 2009-02-16 23:15:44
一種解決方案是通過基座10的對數,比特矯枉過正提供。
您可以使用while循環,它可能會比對數快,因爲這僅使用整數運算:
int len = 0;
while (n > 0) {
len++;
n /= 10;
}
我把它作爲一個練習留給讀者來調整這個算法來處理零和負數。
你可以循環和刪除10,統計你循環的次數;
int num = 423;
int minimum = 1;
while (num > 10) {
num = num/10;
minimum++;
}
int length = (int)Math.Log10(Math.Abs(number)) + 1;
您可能需要考慮負號..
如果你要墊在.NET中的號碼,然後
num.ToString().PadLeft(10, '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 $
比重複分裂一種更有效的解決方案將被重複如果與乘法...例如語句(其中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;
我會發表評論,但我的代表不會給予我這種區別。
所有我想指出的是,即使Log(10)是一個非常優雅的(只有幾行代碼)解決方案,但它可能是處理器上最重要的一個。
我認爲jherico的答案可能是最有效的解決方案,因此應該如此獎勵。
特別是如果你打算做這一個批號的..
雖然對數解決方案獲得最多選票,在我看來,字符串轉換(其中,奇怪的是,提出只有一次)是更好的一個。它完全反映了你的意圖,並且你有可能寫出一個通用組件來處理任何類型的項目(不僅僅是數字)。 – 2012-07-03 17:40:01