2012-03-28 18 views
10

मेरे पास एक संख्या है, उदाहरण के लिए 1234567897865; मैं इसे अधिकतम कैसे कर सकता हूं और 99 99 99 99 99 99 99 कैसे बना सकता हूं?किसी विशेष लंबाई की अधिकतम संख्या कैसे प्राप्त करें

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

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

     long maxNumber = long.Parse(maxNumString); 

क्या इस कार्य दृष्टिकोण बेहतर, उचित और कम तरीका होगा:

मैं इस इस तरह से किया था?

उत्तर

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

नीचे टिप्पणी पर विस्तार करने के लिए, यदि इस समस्या को हेक्स या बाइनरी में व्यक्त की गई थी, यह पारी ऑपरेटरों बहुत बस का उपयोग कर

किया जा सकता है यानी, "मेरे पास एक नंबर, हेक्स में, , उदाहरण के लिए 3 ए 67 एफडी 5 सी; मैं इसे अधिकतम कैसे कर सकता हूं और एफएफएफएफएफएफएफएफ बना सकता हूं? "

मुझे यकीन है कि यह वास्तव में काम करता है बनाने के लिए इस के साथ खेलने के लिए होगा, लेकिन यह कुछ इस तरह होगा:

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

बिगइंटर के तुलनीय तरीके हैं यदि आप 'लंबा' बढ़ते हैं। –

+2

यह गलत है। फ्लोटिंग पॉइंट अंकगणित के गुणों के कारण जब 'x = 10^n'' log (x) 'n से थोड़ा छोटा हो सकता है। जब ऐसा होता है तो आपका कार्य '10^(एन + 1) -1' के बजाय' 10^n-1' देता है। उदाहरण के लिए डबल परिशुद्धता अंकगणित x = 1000 99 99 के बजाय 999 देता है क्योंकि 'लॉग (1000) = 2.99999999999999955591e + 00'। –

+0

आह .... picky! [लेकिन सही]। मैंने इसे संभालने के लिए तय किया है ... @adam, क्यों बस सुझाव दें/स्वयं को ठीक करें ?? –

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

आपका जवाब एक स्वीकार किए जाते हैं की तुलना में बेहतर की तरह। सीपीयू कर सकते हैं जब एफपीयू के साथ परेशान क्यों। फ्लोटिंग पॉइंट से कम अनुमानित, कम परीक्षण सिरदर्द। कुछ बिजली को बचाने में मदद करता है –

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

मैं एक संकलक इस समय उपलब्ध नहीं है, इसलिए कुछ अतिरिक्त स्ट्रिंग/डबल रूपांतरणों को यहां होने की आवश्यकता हो सकती है।

4

इस प्रयास करें:

int v = 1; 
do { 
    v = v * 10; 
} while (v <= number); 
return v - 1; 
संबंधित मुद्दे