मैं बस इस पुराने सवाल पर लड़खड़ाया और लगा कि एक और सुझाव देने का प्रस्ताव है क्योंकि अन्य जवाबों में से कोई भी अब तक सभी संभावित इनपुट मूल्यों के लिए सही परिणाम नहीं देता है और इसे अभी भी तेजी से बनाया जा सकता है:
public static int GetFirstDigit( int i )
{
if( i < 0 && ( i = -i ) < 0 ) return 2;
return ( i < 100 ) ? ( i < 1 ) ? 0 : ( i < 10 )
? i : i / 10 : ( i < 1000000 ) ? ( i < 10000 )
? ( i < 1000 ) ? i / 100 : i / 1000 : ( i < 100000 )
? i / 10000 : i / 100000 : ( i < 100000000 )
? ( i < 10000000 ) ? i / 1000000 : i / 10000000
: ( i < 1000000000 ) ? i / 100000000 : i / 1000000000;
}
यह सभी हस्ताक्षरित पूर्णांक मानों के लिए काम करता है, -2147483648जो कि सबसे छोटा हस्ताक्षरित पूर्णांक है और इसमें सकारात्मक प्रतिपक्ष नहीं है। Math.Abs( -2147483648 )ट्रिगर करता है System.OverflowExceptionऔर - -2147483648करने के लिए गणना करता है -2147483648।
कार्यान्वयन को अब तक के दो सबसे तेज़ कार्यान्वयन के लाभों के संयोजन के रूप में देखा जा सकता है। यह एक द्विआधारी खोज का उपयोग करता है और सतही विभाजन से बचा जाता है। 100,000,000 पुनरावृत्तियों के साथ एक लूप के सूचकांक के साथ एक त्वरित बेंचमार्क दर्शाता है कि यह वर्तमान में सबसे तेज़ कार्यान्वयन से दोगुना है।
यह 2,829,581 टिक्स के बाद खत्म होता है।
तुलना के लिए मैंने वर्तमान में सबसे तेज़ कार्यान्वयन का एक सही संस्करण भी मापा, जिसमें 5,664,627 टिक लगे।
public static int GetFirstDigitX( int i )
{
if( i < 0 && ( i = -i ) < 0 ) return 2;
if( i >= 100000000 ) i /= 100000000;
if( i >= 10000 ) i /= 10000;
if( i >= 100 ) i /= 100;
if( i >= 10 ) i /= 10;
return i;
}
इसी सुधार के साथ स्वीकृत उत्तर के लिए मेरे कंप्यूटर पर इस परीक्षण के लिए 16,561,929 टिक्स की आवश्यकता थी ।
public static int GetFirstDigitY( int i )
{
if( i < 0 && ( i = -i ) < 0 ) return 2;
while( i >= 10 )
i /= 10;
return i;
}
इस तरह के सरल कार्य आसानी से शुद्धता के लिए सिद्ध हो सकते हैं क्योंकि वर्तमान हार्डवेयर पर सभी संभव पूर्णांक मान कुछ सेकंड से अधिक नहीं होते हैं। इसका मतलब यह है कि उन्हें असाधारण रूप से पढ़ने योग्य फैशन में लागू करना कम महत्वपूर्ण है क्योंकि बाद में कभी भी बग को अंदर ठीक करने की आवश्यकता नहीं होगी।