2009-05-29 6 views
5

मैं एक ऐसा फ़ंक्शन बनाने की कोशिश कर रहा हूं जो इंडेक्स पास होने पर मुझे वर्णमाला स्थिति दे। यह वही होगा जैसे एक्सेल यह कॉलम दिखाता है। एक ... जेड, ए.ए., अटल बिहारी .... मैं की तरहबढ़ते वर्णमाला

static string GetColumnName(int index) 
{ 
    const int alphabetsCount = 26; 
    if (index <= alphabetsCount) 
    { 
     int code = (index - 1) + (int)'A'; 
     return char.ConvertFromUtf32(code); 
    } 
    return string.Empty; 
} 

यह 'Z' जब तक ठीक काम करता है जेड तक परिणाम ऐसा लगता है कि प्राप्त करने के लिए नीचे दिए गए समारोह में लिखा था। अगर मैं 1 पास करता हूं तो यह 'ए' वापस लौटाता है और यदि मैं 2 पास करता हूं तो 'बी' वापस कर देता हूं। लेकिन, मैं यह समझने में सक्षम नहीं हूं कि जब मैं इस समारोह में 27 पास करता हूं तो मुझे एए कैसे प्राप्त होगा। मुझे लगता है मुझे इसे खोजने के लिए एक पुनरावर्ती विधि की आवश्यकता है।

इस समस्या के लिए कोई भी इनपुट बहुत अच्छा होगा!

संपादित

यह Tordek ने सुझाव दिया है। लेकिन उनका कोड 52, 78 इत्यादि जैसी संख्याओं में असफल हो जाएगा। इसके लिए वर्कअराउंड जोड़ा गया है और यहां अंतिम कामकाजी कोड है।

static string GetColumnName(int index) 
{ 
    const int alphabetsCount = 26; 

    if (index > alphabetsCount) 
    { 
     int mod = index % alphabetsCount; 
     int columnIndex = index/alphabetsCount; 

     // if mod is 0 (clearly divisible) we reached end of one combination. Something like AZ 
     if (mod == 0) 
     { 
      // reducing column index as index/alphabetsCount will give the next value and we will miss one column. 
      columnIndex -= 1; 
      // passing 0 to the function will return character '@' which is invalid 
      // mod should be the alphabets count. So it takes the last char in the alphabet. 
      mod = alphabetsCount; 
     } 
     return GetColumnName(columnIndex) + GetColumnName(mod); 
    } 
    else 
    { 
     int code = (index - 1) + (int)'A'; 
     return char.ConvertFromUtf32(code); 
    } 
} 

उत्तर

4

कोई भी पुनरावर्ती फ़ंक्शन समकक्ष पुनरावर्तक में परिवर्तित किया जा सकता है। मैं यह हमेशा आसान रिकर्सिवली पहले सोचने के लिए लगता है:

static string GetColumnName(int index) 
{ 
    const int alphabetsCount = 26; 

    if (index > alphabetsCount) { 
     return GetColumnName(index/alphabetsCount) + GetColumnName(index % alphabetsCount); 
    } else { 
     int code = (index - 1) + (int)'A'; 
     return char.ConvertFromUtf32(code); 
    } 
} 

कौन सा में सरल परिवर्तित किया जा सकता:

static string GetColumnName(int index) 
{ 
    const int alphabetsCount = 26; 
    string result = string.Empty; 

    while (index > 0) { 
     result = char.ConvertFromUtf32(64 + (index % alphabetsCount)) + result; 
     index /= alphabetsCount; 
    } 

    return result; 
} 

फिर भी, जोएल को सुनने के।

+0

ग्रेट।मेरा गणित जंगली है। तो मॉड्यूलो ऑपरेशन का पता नहीं लगा सका। कोड के लिए धन्यवाद। –

0

Recursion एक संभावना है - अगर index > 26, तो आप इस कॉल में index % 26 से निपटने और index/26 पर एक पुनरावर्ती कॉल करने के लिए यह श्रेणीबद्ध। हालांकि, पुनरावृत्ति अक्सर तेज होती है और इस तरह के साधारण मामलों की व्यवस्था करना कठिन नहीं होता है। छद्म कोड में:

string result = <convert `index % 26`> 
while index > 26: 
    index = index/26 
    result = <convert `index % 26`> + result 
return result 

या इसी तरह की।

+0

आपके स्यूडोकोड साथ कुछ भी गलत नहीं है, लेकिन यह पता चला है कि आप शायद वस्तु आवंटन पर बचाने के लिए StringBuilder वर्ग उपयोग करें यदि आप एक पाश में एक स्ट्रिंग को जोड़कर करने जा रहे हैं चाहिए, महत्वपूर्ण है: http://msdn.microsoft.com/en-us/library/system.text.stringbuilder(loband).aspx –

+0

यह गलत है क्योंकि यह आधार 26 सिस्टम नहीं है। यदि ए 0 होगा, ए एए (0 == 00) के बराबर होगा। यदि ए 1 होगा, तो ज़ेड से एए में जाकर 9 से 11 तक जा रहेगा। –

+0

पॉल, स्ट्रिंगबिल्डर ओवरकिल है। एक 32-बिट int 2^32 और 26^7 अतिप्रवाह है इसलिए अधिकतम 7 अक्षर लंबा है। 7 पुनरावृत्तियों शायद ही कर लग रहा है। एक 64-बिट लंबे समय में केवल 14 अक्षर होंगे। :) –

0
 
static string GetColumnName(int index) 
{ 
    const int alphabetsCount = 26; 
    string result = ''; 

    if (index >= alphabetsCount) 
    { 
     result += GetColumnName(index-alphabetsCount) 
    } 
    return (string) (64 + index); 
} 

मेरा सी # हॉरिबल और रूस्टी है। इसे छद्म कोड के रूप में व्याख्या करें - यह लगभग निश्चित रूप से संकलित नहीं होगा, लेकिन आप शुरू कर सकते हैं।

-1

मैं सी # में प्रश्न का उत्तर नहीं देना चाहता हूं लेकिन मैं आपको यह दिखाने के लिए जा रहा हूं कि यह हास्केल में कितना आसान है।

alphas :: [String] 
alphas = [x ++ [c] | x <- ([]:alphas), c <- ['A'..'Z']] 

Prelude> take 100 alphas 
["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T", 
"U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK", 
"AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA", 
"BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ", 
"BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG", 
"CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV"]