इंटरनेट पर देखकर काउंटर वैरिएबल को 0 से शुरू करने की गलती करना और तब तक प्री-कंडीशन लूप परीक्षण दर्ज करना आम है जब तक कि गिनती 0 के बराबर न हो। एक डू-लूप लूप से बचने के लिए सही है इस।
unsigned udc(unsigned u) //unsigned digit count
{
unsigned c = 0;
do
++c;
while ((u /= 10) != 0);
return c;
}
यह शायद परीक्षण करने के लिए है कि क्या यू है कम से कम मामलों में जहां यू < के लिए uneccessary प्रभाग, वेतन वृद्धि, और सीएमपी निर्देश से बचने के लिए सस्ता है।
लेकिन जब उस विषय, अनुकूलन पर, तो आप बस दस की लगातार शक्तियों के खिलाफ यू का परीक्षण कर सकता है।
unsigned udc(unsigned u) //unsigned digit count
{
if (u < 10) return 1;
if (u < 100) return 2;
if (u < 1000) return 3;
//...
return 0; //number was not supported
}
जो आप अंकों प्रति निर्देश बचाता है, लेकिन Inaddition हाथ से लिखने के रूप में आकर्षक, और थकाऊ नहीं किया जा रहा करने के लिए विभिन्न radixes के लिए कम अनुकूलनीय है, ऐसी स्थिति में आप बल्कि लिखने के लिए एक नियमित लिखते हैं इसे अपने कार्यक्रम में डालने से पहले दिनचर्या। क्योंकि सी केवल बहुत सीमित संख्या का समर्थन करता है, 64 बिट, 32 बिट, 16bit, 8bit, तो आप बस अपने आप को अधिकतम करने के लिए सीमित कर जब दिनचर्या पैदा सभी आकार के लाभ के लिए कर सकता है।
ऋणात्मक संख्याओं के लिए खाते, तो आप बस अगर यू < अंक की संख्या की गणना से पहले यू नकारना चाहते हैं। निश्चित रूप से पहले नियमित समर्थन हस्ताक्षर संख्याओं पर हस्ताक्षर किए।
यदि आप जानते हैं कि यू < , यह शायद आसान सिर्फ लिखने के लिए है, बजाय नियमित लेखन की।
if (u > 99) len = 3;
else
if (u > 9) len = 2;
else len = 1;
बस एक विचार: ऋणात्मक संख्याओं को कैसे संभाला जाना चाहिए? – Joey
आपको यहां 'std :: string' क्यों चाहिए? आप बस एक 'strlen (buffer_length) 'कर सकते हैं। आपको '\ n' और इस प्रकार कोई' -1' की आवश्यकता नहीं है। – leemes
संभावित डुप्लिकेट: http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer – Rishi