दिलचस्प पोस्ट
सरणी के अंतिम तत्व को हटाने के बिना सबसे अच्छा तरीका क्या है? अधिकांश पायथनिक तरीके से प्रिंट करने का * अधिकतम * कुछ दशमलव स्थानों विजुअल स्टूडियो 2013 – कोई विजुअल बेसिक / विज़ुअल सी # वेब टेम्पलेट्स इंस्टॉल किए गए विशिष्ट उपयोगकर्ता इनपुट तक डुप्लिकेट सहभागी कॉलम के रूप में पक्ष की प्राथमिक कुंजी अपाचे बीम में विभिन्न BigQuery तालिकाओं में विभिन्न मानों को लिखना कैसे SQL सर्वर में वैश्विक चर घोषित करने के लिए ..? कैसे printf के माध्यम से बाइनरी संख्या को मुद्रित करने के लिए दृश्य स्टूडियो में सशर्त ब्रेकपॉइंट कैसे सेट करें? निंजा 2 + (और मैं अपने मॉड्यूल की व्यवस्था कैसे करूँ) के साथ इंजेक्शन कहाँ करूँ? .NET अपवाद कितना धीमा है? PHP_excel के लिए वैकल्पिक CSS का उपयोग करते हुए वैकल्पिक तालिका पंक्ति का रंग? बाईं ओर 255 स्थानांतरण (एक बाइट के रूप में) समय के लिए कई असफल लॉगिन के लिए अनुरोध को ब्लॉक करें

आधार 10 नंबर को किसी भी आधार को एनएटी में कनवर्ट करने का सबसे तेज़ तरीका है?

मेरे पास और पुरानी (आईएसएच) सी # विधि है जो मैंने लिखा है कि कोई संख्या लेता है और इसे किसी भी आधार पर परिवर्तित कर देता है:

string ConvertToBase(int number, char[] baseChars); 

यह सब बहुत तेज और साफ नहीं है .NET में इसे प्राप्त करने का एक अच्छा, ज्ञात तरीका क्या है?

मैं ऐसी चीज़ों की तलाश कर रहा हूं जो मुझे किसी भी आधार का उपयोग करने के लिए पात्रों की एक मनमानी स्ट्रिंग के साथ उपयोग करने की अनुमति देता है।

यह केवल तराजू 16, 10, 8 और 2 की अनुमति देता है:

 Convert.ToString(1, x); 

मैं इसका उपयोग करने के लिए संख्याओं का लाभ लेने के लिए बड़े पैमाने पर उच्च आधार प्राप्त करने, सभी लोअर केस और सभी ऊपरी केस अक्षरों का उपयोग करना चाहता हूं। इस धागे की तरह , लेकिन सी # के लिए नहीं जावास्क्रिप्ट

क्या कोई सी # में ऐसा करने का एक अच्छा और कुशल तरीका जानता है?

Solutions Collecting From Web of "आधार 10 नंबर को किसी भी आधार को एनएटी में कनवर्ट करने का सबसे तेज़ तरीका है?"

कन्वर्ट। Convert.ToString का उपयोग किसी निर्दिष्ट बेस में उसके समतुल्य स्ट्रिंग प्रतिनिधित्व में कनवर्ट करने के लिए किया जा सकता है।

उदाहरण:

 string binary = Convert.ToString(5, 2); // convert 5 to its binary representation Console.WriteLine(binary); // prints 101 

हालांकि, जैसा कि टिप्पणियों द्वारा बताया गया है, Convert.ToString केवल निम्नलिखित सीमित का समर्थन करता है – लेकिन आधारभूत रूप से पर्याप्त आधार – 2, 8, 10, या 16।

अपडेट (किसी भी आधार में बदलने की आवश्यकता को पूरा करने के लिए):

मुझे बीसीएल में किसी भी तरीके से अवगत नहीं है जो नंबरों को किसी भी आधार में परिवर्तित करने में सक्षम है ताकि आपको अपना छोटा उपयोगिता फ़ंक्शन लिखना पड़े। एक साधारण नमूना ऐसा दिखेगा (ध्यान दें कि यह निश्चित रूप से स्ट्रिंग संयोजन के स्थान पर तेजी से बनाया जा सकता है):

 class Program { static void Main(string[] args) { // convert to binary string binary = IntToString(42, new char[] { '0', '1' }); // convert to hexadecimal string hex = IntToString(42, new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}); // convert to hexavigesimal (base 26, AZ) string hexavigesimal = IntToString(42, Enumerable.Range('A', 26).Select(x => (char)x).ToArray()); // convert to sexagesimal string xx = IntToString(42, new char[] { '0','1','2','3','4','5','6','7','8','9', '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', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'}); } public static string IntToString(int value, char[] baseChars) { string result = string.Empty; int targetBase = baseChars.Length; do { result = baseChars[value % targetBase] + result; value = value / targetBase; } while (value > 0); return result; } /// <summary> /// An optimized method using an array as buffer instead of /// string concatenation. This is faster for return values having /// a length > 1. /// </summary> public static string IntToStringFast(int value, char[] baseChars) { // 32 is the worst cast buffer size for base 2 and int.MaxValue int i = 32; char[] buffer = new char[i]; int targetBase= baseChars.Length; do { buffer[--i] = baseChars[value % targetBase]; value = value / targetBase; } while (value > 0); char[] result = new char[32 - i]; Array.Copy(buffer, i, result, 0, 32 - i); return new string(result); } } 

अपडेट 2 (प्रदर्शन सुधार)

परिणाम स्ट्रिंग बनाने के लिए स्ट्रिंग संयोजन के बजाय सरणी बफ़र का उपयोग करना विशेष रूप से बड़ी संख्या में एक प्रदर्शन सुधार देता है (विधि IntToStringFast देखें) सबसे अच्छे मामले में (यानी सबसे लंबे समय तक संभव इनपुट) इस पद्धति का लगभग तीन गुना तेज है हालांकि, 1 अंकों की संख्या (अर्थात लक्ष्य के आधार पर 1-अंक) के लिए, IntToString तेजी से होगा

मैंने हाल ही में इस बारे में ब्लॉग किया । मेरा क्रियान्वयन गणनाओं के दौरान किसी भी स्ट्रिंग ऑपरेशन का उपयोग नहीं करता है, जो इसे बहुत तेज़ बनाता है 2 से 36 आधार वाले किसी भी अंक प्रणाली में रूपांतरण समर्थित है:

 /// <summary> /// Converts the given decimal number to the numeral system with the /// specified radix (in the range [2, 36]). /// </summary> /// <param name="decimalNumber">The number to convert.</param> /// <param name="radix">The radix of the destination numeral system (in the range [2, 36]).</param> /// <returns></returns> public static string DecimalToArbitrarySystem(long decimalNumber, int radix) { const int BitsInLong = 64; const string Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (radix < 2 || radix > Digits.Length) throw new ArgumentException("The radix must be >= 2 and <= " + Digits.Length.ToString()); if (decimalNumber == 0) return "0"; int index = BitsInLong - 1; long currentNumber = Math.Abs(decimalNumber); char[] charArray = new char[BitsInLong]; while (currentNumber != 0) { int remainder = (int)(currentNumber % radix); charArray[index--] = Digits[remainder]; currentNumber = currentNumber / radix; } string result = new String(charArray, index + 1, BitsInLong - index - 1); if (decimalNumber < 0) { result = "-" + result; } return result; } 

किसी भी व्यक्ति को इसकी भी आवश्यकता है, मैंने भी एक त्वरित व्युत्क्रम समारोह को लागू किया है: दशमलव संख्या प्रणाली के लिए मनमाना

एक स्वीकार किए गए एक के थोड़ा संशोधित संस्करण का उपयोग भी कर सकता है और इसकी आवश्यकताओं के लिए मूल अक्षर स्ट्रिंग को समायोजित कर सकता है:

 public static string Int32ToString(int value, int toBase) { string result = string.Empty; do { result = "0123456789ABCDEF"[value % toBase] + result; value /= toBase; } while (value > 0); return result; } 

इस एक पर पार्टी के लिए बहुत देर हो चुकी है, लेकिन हाल में मैं काम पर एक परियोजना के लिए निम्नलिखित सहायक वर्ग को लिखा था। यह लघु तारों को संख्याओं में परिवर्तित करने और फिर से वापस करने के लिए डिजाइन किया गया था (एक सरलीकृत सही हैश फ़ंक्शन), हालांकि यह मनमानी ठिकानों के बीच संख्या रूपांतरण भी करेगा। Base10ToString 10 Base10ToString विधि कार्यान्वयन मूल रूप से पोस्ट किए गए प्रश्न का उत्तर देता है।

shouldSupportRoundTripping पास संख्या के स्ट्रिंग से बेस -10 तक प्रमुख अंकों के नुकसान को रोकने के लिए और फिर से वापस (महत्वपूर्ण, मेरी आवश्यकताओं के अनुसार!) को चाहिए था। ज्यादातर समय संख्या स्ट्रिंग से प्रमुख 0s की हानि शायद एक मुद्दा नहीं होगा।

वैसे भी, यहां कोड है:

 using System; using System.Collections.Generic; using System.Linq; namespace StackOverflow { /// <summary> /// Contains methods used to convert numbers between base-10 and another numbering system. /// </summary> /// <remarks> /// <para> /// This conversion class makes use of a set of characters that represent the digits used by the target /// numbering system. For example, binary would use the digits 0 and 1, whereas hex would use the digits /// 0 through 9 plus A through F. The digits do not have to be numerals. /// </para> /// <para> /// The first digit in the sequence has special significance. If the number passed to the /// <see cref="StringToBase10"/> method has leading digits that match the first digit, then those leading /// digits will effectively be 'lost' during conversion. Much of the time this won't matter. For example, /// "0F" hex will be converted to 15 decimal, but when converted back to hex it will become simply "F", /// losing the leading "0". However, if the set of digits was A through Z, and the number "ABC" was /// converted to base-10 and back again, then the leading "A" would be lost. The <see cref="System.Boolean"/> /// flag passed to the constructor allows 'round-tripping' behaviour to be supported, which will prevent /// leading digits from being lost during conversion. /// </para> /// <para> /// Note that numeric overflow is probable when using longer strings and larger digit sets. /// </para> /// </remarks> public class Base10Converter { const char NullDigit = '\0'; public Base10Converter(string digits, bool shouldSupportRoundTripping = false) : this(digits.ToCharArray(), shouldSupportRoundTripping) { } public Base10Converter(IEnumerable<char> digits, bool shouldSupportRoundTripping = false) { if (digits == null) { throw new ArgumentNullException("digits"); } if (digits.Count() == 0) { throw new ArgumentException( message: "The sequence is empty.", paramName: "digits" ); } if (!digits.Distinct().SequenceEqual(digits)) { throw new ArgumentException( message: "There are duplicate characters in the sequence.", paramName: "digits" ); } if (shouldSupportRoundTripping) { digits = (new[] { NullDigit }).Concat(digits); } _digitToIndexMap = digits .Select((digit, index) => new { digit, index }) .ToDictionary(keySelector: x => x.digit, elementSelector: x => x.index); _radix = _digitToIndexMap.Count; _indexToDigitMap = _digitToIndexMap .ToDictionary(keySelector: x => x.Value, elementSelector: x => x.Key); } readonly Dictionary<char, int> _digitToIndexMap; readonly Dictionary<int, char> _indexToDigitMap; readonly int _radix; public long StringToBase10(string number) { Func<char, int, long> selector = (c, i) => { int power = number.Length - i - 1; int digitIndex; if (!_digitToIndexMap.TryGetValue(c, out digitIndex)) { throw new ArgumentException( message: String.Format("Number contains an invalid digit '{0}' at position {1}.", c, i), paramName: "number" ); } return Convert.ToInt64(digitIndex * Math.Pow(_radix, power)); }; return number.Select(selector).Sum(); } public string Base10ToString(long number) { if (number < 0) { throw new ArgumentOutOfRangeException( message: "Value cannot be negative.", paramName: "number" ); } string text = string.Empty; long remainder; do { number = Math.DivRem(number, _radix, out remainder); char digit; if (!_indexToDigitMap.TryGetValue((int) remainder, out digit) || digit == NullDigit) { throw new ArgumentException( message: "Value cannot be converted given the set of digits used by this converter.", paramName: "number" ); } text = digit + text; } while (number > 0); return text; } } } 

यह कस्टम संख्या कन्वर्टर्स प्राप्त करने के लिए उप-क्लास भी हो सकता है:

 namespace StackOverflow { public sealed class BinaryNumberConverter : Base10Converter { public BinaryNumberConverter() : base(digits: "01", shouldSupportRoundTripping: false) { } } public sealed class HexNumberConverter : Base10Converter { public HexNumberConverter() : base(digits: "0123456789ABCDEF", shouldSupportRoundTripping: false) { } } } 

और कोड इस तरह इस्तेमाल किया जाएगा:

 using System.Diagnostics; namespace StackOverflow { class Program { static void Main(string[] args) { { var converter = new Base10Converter( digits: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz", shouldSupportRoundTripping: true ); long number = converter.StringToBase10("Atoz"); string text = converter.Base10ToString(number); Debug.Assert(text == "Atoz"); } { var converter = new HexNumberConverter(); string text = converter.Base10ToString(255); long number = converter.StringToBase10(text); Debug.Assert(number == 255); } } } } 

फास्ट " से " और "से" विधियां

मैं पार्टी के लिए देर हो चुकी हूं, लेकिन मैं पिछले उत्तरों को जोड़ता रहा और उनके ऊपर सुधार किया। मुझे लगता है कि इन दोनों विधियों में अब तक किसी भी पोस्ट की तुलना में तेज़ हैं।

नीचे का उदाहरण आधार 62 के लिए है । परिवर्तित करने के लिए और किसी भी अन्य आधार को परिवर्तित करने के लिए BaseChars ऐरे बदलें।

 private static readonly char[] BaseChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray(); private static readonly Dictionary<char, int> CharValues = BaseChars .Select((c,i)=>new {Char=c, Index=i}) .ToDictionary(c=>c.Char,c=>c.Index); public static string LongToBase(long value) { long targetBase = BaseChars.Length; // Determine exact number of characters to use. char[] buffer = new char[Math.Max( (int) Math.Ceiling(Math.Log(value + 1, targetBase)), 1)]; var i = (long) buffer.Length; do { buffer[--i] = BaseChars[value % targetBase]; value = value / targetBase; } while (value > 0); return new string(buffer); } public static long BaseToLong(string number) { char[] chrs = number.ToCharArray(); int m = chrs.Length - 1; int n = BaseChars.Length, x; long result = 0; for (int i = 0; i < chrs.Length; i++) { x = CharValues[ chrs[i] ]; result += x * (long)Math.Pow(n, m--); } return result; } 

क्या इस मंच से इस वर्ग की मदद से आप मदद कर सकते हैं?

 public class BaseConverter { public static string ToBase(string number, int start_base, int target_base) { int base10 = this.ToBase10(number, start_base); string rtn = this.FromBase10(base10, target_base); return rtn; } public static int ToBase10(string number, int start_base) { if (start_base < 2 || start_base > 36) return 0; if (start_base == 10) return Convert.ToInt32(number); char[] chrs = number.ToCharArray(); int m = chrs.Length - 1; int n = start_base; int x; int rtn = 0; foreach(char c in chrs) { if (char.IsNumber(c)) x = int.Parse(c.ToString()); else x = Convert.ToInt32(c) - 55; rtn += x * (Convert.ToInt32(Math.Pow(n, m))); m--; } return rtn; } public static string FromBase10(int number, int target_base) { if (target_base < 2 || target_base > 36) return ""; if (target_base == 10) return number.ToString(); int n = target_base; int q = number; int r; string rtn = ""; while (q >= n) { r = q % n; q = q / n; if (r < 10) rtn = r.ToString() + rtn; else rtn = Convert.ToChar(r + 55).ToString() + rtn; } if (q < 10) rtn = q.ToString() + rtn; else rtn = Convert.ToChar(q + 55).ToString() + rtn; return rtn; } } 

पूरी तरह से अनधिकृत … मुझे पता है कि यह काम करता है! (फ़ोरम पोस्ट को समाप्त होने या कुछ और के मामले में इसे चिपकाएं …)

मैं भी दशमलव संख्या को [2..36] की सीमा में दूसरे स्थान पर परिवर्तित करने की एक तेज़ तरीके की तलाश कर रहा था इसलिए मैंने निम्न कोड विकसित किया। एक स्ट्रिंगबिलर ऑब्जेक्ट का अनुसरण करना सरल है और एक चरित्र बफर के लिए एक प्रॉक्सी के रूप में उपयोग करता है जिसे हम चरित्र के आधार पर वर्णित कर सकते हैं। यह कोड वैकल्पिक रूप से बहुत तेजी से और एक चरित्र सरणी में अलग-अलग वर्णों को आरंभ करने से बहुत तेजी से प्रतीत होता है।

अपने स्वयं के उपयोग के लिए आप इसे पसंद कर सकते हैं: 1 / अपवाद छोड़ने के बजाय रिक्त स्ट्रिंग लौटें 2 / विधि को तेजी से चलाने के लिए रेडिक्स चेक को निकालना 3 / स्ट्रिंगबिल्ल्डर ऑब्जेक्ट को 32 '0 के साथ आरंभ करें और लाइन परिणाम निकाल दें। निकालें (0, i) ;. इसका कारण स्ट्रिंग को प्रमुख शून्य के साथ वापस करना होगा और गति को और भी बढ़ाना होगा 4 / स्ट्रिंगबिलर को क्लास के भीतर एक स्थैतिक फ़ील्ड बनाते हैं, चाहे कितनी बार दशमलवतमबेस विधि को स्ट्रिंगबिलर ऑब्जेक्ट कहा जाता है, केवल एक बार प्रारंभिक रूप से शुरू किया जाता है। यदि आप ऐसा 3 बदलाव करते हैं तो यह काम नहीं करेगा।

मुझे उम्मीद है कि किसी को यह उपयोगी पाता है 🙂

AtomicParadox

  static string DecimalToBase(int number, int radix) { // Check that the radix is between 2 and 36 inclusive if ( radix < 2 || radix > 36 ) throw new ArgumentException("ConvertToBase(int number, int radix) - Radix must be between 2 and 36."); // Create a buffer large enough to hold the largest int value represented in binary digits StringBuilder result = new StringBuilder(" "); // 32 spaces // The base conversion calculates the digits in reverse order so use // an index to point to the last unused space in our buffer int i = 32; // Convert the number to the new base do { int remainder = number % radix; number = number / radix; if(remainder <= 9) result[--i] = (char)(remainder + '0'); // Converts [0..9] to ASCII ['0'..'9'] else result[--i] = (char)(remainder + '7'); // Converts [10..36] to ASCII ['A'..'Z'] } while ( number > 0 ); // Remove the unwanted padding from the front of our buffer and return the result // Note i points to the last unused character in our buffer result.Remove( 0, i ); return (result.ToString()); } 

मैं इसका इस्तेमाल गुड को कम स्ट्रिंग के रूप में रखने के लिए कर रहा था (लेकिन 106 वर्णों का उपयोग करने के लिए सीमित था)। अगर किसी को यहाँ दिलचस्पी है तो स्ट्रिंग को वापस संख्यात्मक मूल्य पर डिकोड करने के लिए मेरा कोड है (इस मामले में मैंने इंट 128 को कोडिंग करने के बजाय ग्रिड वैल्यू के लिए 2 उलसों का इस्तेमाल किया है (चूंकि मैं 3.5 में 4.0 नहीं हूं।) स्पष्टता के लिए CODE 106 अद्वितीय वर्णों के साथ स्ट्रिंग कन्वर्ज़। कन्वर्टलॉन्गटोबाइट्स बहुत अप्रभावी हैं।

 private static Guid B106ToGuid(string pStr) { try { ulong tMutl = 1, tL1 = 0, tL2 = 0, targetBase = (ulong)CODE.Length; for (int i = 0; i < pStr.Length / 2; i++) { tL1 += (ulong)CODE.IndexOf(pStr[i]) * tMutl; tL2 += (ulong)CODE.IndexOf(pStr[pStr.Length / 2 + i]) * tMutl; tMutl *= targetBase; } return new Guid(ConvertLongsToBytes(tL1, tL2)); } catch (Exception ex) { throw new Exception("B106ToGuid failed to convert string to Guid", ex); } } 

मुझे एक जैसी ज़रूरत थी, सिवाय इसके कि मुझे "संख्याओं" पर गणित करने की आवश्यकता भी थी। मैंने कुछ सुझाव यहां दिए और एक ऐसा वर्ग बनाया जो यह सब मजेदार सामान करेगा यह किसी भी यूनिकोड वर्ण को किसी संख्या का प्रतिनिधित्व करने के लिए उपयोग करने की अनुमति देता है और यह दशमलव के साथ भी काम करता है

इस वर्ग का इस्तेमाल करना बहुत आसान है बस एक New BaseNumber प्रकार के रूप में एक संख्या New BaseNumber , कुछ गुण सेट करें, और अपनी बंद करें दिनचर्या आधार 10 और बेस एक्स के बीच स्विचिंग का स्वचालित रूप से ध्यान रखती है और आपके द्वारा सेट किए गए मान को इसे सेट किए गए आधार में संरक्षित किया जाता है, इसलिए कोई सटीकता नहीं खोई जाती है (रूपांतरण होने तक, लेकिन तब भी सटीक नुकसान बहुत कम होना चाहिए क्योंकि यह दिनचर्या Double और Long जहां कभी भी संभव है) का उपयोग करता है

मैं इस रूटीन की गति पर कमांड नहीं कर सकता यह शायद काफी धीमा है, इसलिए मुझे यकीन नहीं है कि यदि वह सवाल पूछने वाले की जरूरतों के अनुरूप होगा, लेकिन यह निश्चित है, तो उम्मीद है कि कोई और इस का उपयोग कर सकता है।

किसी भी अन्य के लिए जिसे Excel में अगले कॉलम की गणना के लिए इस कोड की आवश्यकता हो सकती है, मैं उस लूपिंग कोड को शामिल करूँगा जिसका उपयोग मैं इस वर्ग का लाभ उठाता हूं।

 Public Class BaseNumber Private _CharacterArray As List(Of Char) Private _BaseXNumber As String Private _Base10Number As Double? Private NumberBaseLow As Integer Private NumberBaseHigh As Integer Private DecimalSeparator As Char = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator Private GroupSeparator As Char = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator Public Sub UseCapsLetters() 'http://unicodelookup.com TrySetBaseSet(65, 90) End Sub Public Function GetCharacterArray() As List(Of Char) Return _CharacterArray End Function Public Sub SetCharacterArray(CharacterArray As String) _CharacterArray = New List(Of Char) _CharacterArray.AddRange(CharacterArray.ToList) TrySetBaseSet(_CharacterArray) End Sub Public Sub SetCharacterArray(CharacterArray As List(Of Char)) _CharacterArray = CharacterArray TrySetBaseSet(_CharacterArray) End Sub Public Sub SetNumber(Value As String) _BaseXNumber = Value _Base10Number = Nothing End Sub Public Sub SetNumber(Value As Double) _Base10Number = Value _BaseXNumber = Nothing End Sub Public Function GetBaseXNumber() As String If _BaseXNumber IsNot Nothing Then Return _BaseXNumber Else Return ToBaseString() End If End Function Public Function GetBase10Number() As Double If _Base10Number IsNot Nothing Then Return _Base10Number Else Return ToBase10() End If End Function Private Sub TrySetBaseSet(Values As List(Of Char)) For Each value As Char In _BaseXNumber If Not Values.Contains(value) Then Throw New ArgumentOutOfRangeException("The string has a value, " & value & ", not contained in the selected 'base' set.") _CharacterArray.Clear() DetermineNumberBase() End If Next _CharacterArray = Values End Sub Private Sub TrySetBaseSet(LowValue As Integer, HighValue As Integer) Dim HighLow As KeyValuePair(Of Integer, Integer) = GetHighLow() If HighLow.Key < LowValue OrElse HighLow.Value > HighValue Then Throw New ArgumentOutOfRangeException("The string has a value not contained in the selected 'base' set.") _CharacterArray.Clear() DetermineNumberBase() End If NumberBaseLow = LowValue NumberBaseHigh = HighValue End Sub Private Function GetHighLow(Optional Values As List(Of Char) = Nothing) As KeyValuePair(Of Integer, Integer) If Values Is Nothing Then Values = _BaseXNumber.ToList End If Dim lowestValue As Integer = Convert.ToInt32(Values(0)) Dim highestValue As Integer = Convert.ToInt32(Values(0)) Dim currentValue As Integer For Each value As Char In Values If value <> DecimalSeparator AndAlso value <> GroupSeparator Then currentValue = Convert.ToInt32(value) If currentValue > highestValue Then highestValue = currentValue End If If currentValue < lowestValue Then currentValue = lowestValue End If End If Next Return New KeyValuePair(Of Integer, Integer)(lowestValue, highestValue) End Function Public Sub New(BaseXNumber As String) _BaseXNumber = BaseXNumber DetermineNumberBase() End Sub Public Sub New(BaseXNumber As String, NumberBase As Integer) Me.New(BaseXNumber, Convert.ToInt32("0"c), NumberBase) End Sub Public Sub New(BaseXNumber As String, NumberBaseLow As Integer, NumberBaseHigh As Integer) _BaseXNumber = BaseXNumber Me.NumberBaseLow = NumberBaseLow Me.NumberBaseHigh = NumberBaseHigh End Sub Public Sub New(Base10Number As Double) _Base10Number = Base10Number End Sub Private Sub DetermineNumberBase() Dim highestValue As Integer Dim currentValue As Integer For Each value As Char In _BaseXNumber currentValue = Convert.ToInt32(value) If currentValue > highestValue Then highestValue = currentValue End If Next NumberBaseHigh = highestValue NumberBaseLow = Convert.ToInt32("0"c) 'assume 0 is the lowest End Sub Private Function ToBaseString() As String Dim Base10Number As Double = _Base10Number Dim intPart As Long = Math.Truncate(Base10Number) Dim fracPart As Long = (Base10Number - intPart).ToString.Replace(DecimalSeparator, "") Dim intPartString As String = ConvertIntToString(intPart) Dim fracPartString As String = If(fracPart <> 0, DecimalSeparator & ConvertIntToString(fracPart), "") Return intPartString & fracPartString End Function Private Function ToBase10() As Double Dim intPartString As String = _BaseXNumber.Split(DecimalSeparator)(0).Replace(GroupSeparator, "") Dim fracPartString As String = If(_BaseXNumber.Contains(DecimalSeparator), _BaseXNumber.Split(DecimalSeparator)(1), "") Dim intPart As Long = ConvertStringToInt(intPartString) Dim fracPartNumerator As Long = ConvertStringToInt(fracPartString) Dim fracPartDenominator As Long = ConvertStringToInt(GetEncodedChar(1) & String.Join("", Enumerable.Repeat(GetEncodedChar(0), fracPartString.ToString.Length))) Return Convert.ToDouble(intPart + fracPartNumerator / fracPartDenominator) End Function Private Function ConvertIntToString(ValueToConvert As Long) As String Dim result As String = String.Empty Dim targetBase As Long = GetEncodingCharsLength() Do result = GetEncodedChar(ValueToConvert Mod targetBase) & result ValueToConvert = ValueToConvert \ targetBase Loop While ValueToConvert > 0 Return result End Function Private Function ConvertStringToInt(ValueToConvert As String) As Long Dim result As Long Dim targetBase As Integer = GetEncodingCharsLength() Dim startBase As Integer = GetEncodingCharsStartBase() Dim value As Char For x As Integer = 0 To ValueToConvert.Length - 1 value = ValueToConvert(x) result += GetDecodedChar(value) * Convert.ToInt32(Math.Pow(GetEncodingCharsLength, ValueToConvert.Length - (x + 1))) Next Return result End Function Private Function GetEncodedChar(index As Integer) As Char If _CharacterArray IsNot Nothing AndAlso _CharacterArray.Count > 0 Then Return _CharacterArray(index) Else Return Convert.ToChar(index + NumberBaseLow) End If End Function Private Function GetDecodedChar(character As Char) As Integer If _CharacterArray IsNot Nothing AndAlso _CharacterArray.Count > 0 Then Return _CharacterArray.IndexOf(character) Else Return Convert.ToInt32(character) - NumberBaseLow End If End Function Private Function GetEncodingCharsLength() As Integer If _CharacterArray IsNot Nothing AndAlso _CharacterArray.Count > 0 Then Return _CharacterArray.Count Else Return NumberBaseHigh - NumberBaseLow + 1 End If End Function Private Function GetEncodingCharsStartBase() As Integer If _CharacterArray IsNot Nothing AndAlso _CharacterArray.Count > 0 Then Return GetHighLow.Key Else Return NumberBaseLow End If End Function End Class 

और अब एक्सेल कॉलम के माध्यम से कोड को लूप के लिए:

  Public Function GetColumnList(DataSheetID As String) As List(Of String) Dim workingColumn As New BaseNumber("A") workingColumn.SetCharacterArray("@ABCDEFGHIJKLMNOPQRSTUVWXYZ") Dim listOfPopulatedColumns As New List(Of String) Dim countOfEmptyColumns As Integer Dim colHasData As Boolean Dim cellHasData As Boolean Do colHasData = True cellHasData = False For r As Integer = 1 To GetMaxRow(DataSheetID) cellHasData = cellHasData Or XLGetCellValue(DataSheetID, workingColumn.GetBaseXNumber & r) <> "" Next colHasData = colHasData And cellHasData 'keep trying until we get 4 empty columns in a row If colHasData Then listOfPopulatedColumns.Add(workingColumn.GetBaseXNumber) countOfEmptyColumns = 0 Else countOfEmptyColumns += 1 End If 'we are already starting with column A, so increment after we check column A Do workingColumn.SetNumber(workingColumn.GetBase10Number + 1) Loop Until Not workingColumn.GetBaseXNumber.Contains("@") Loop Until countOfEmptyColumns > 3 Return listOfPopulatedColumns End Function 

आप ध्यान दें कि Excel भाग का महत्वपूर्ण भाग यह है कि 0 को पुनः आधारित संख्या में @ द्वारा पहचाना जाता है। इसलिए मैं उन सभी नंबरों को फ़िल्टर करता हूं जिन पर उनके पास एक @ है और मुझे उचित अनुक्रम (ए, बी, सी, …, जेड, एए, एबी, एसी, …) मिलता है।

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConvertToAnyBase { class Program { static void Main(string[] args) { var baseNumber = int.Parse(Console.ReadLine()); var number = int.Parse(Console.ReadLine()); string conversion = ""; while(number!=0) { conversion += Convert.ToString(number % baseNumber); number = number / baseNumber; } var conversion2 = conversion.ToArray().Reverse(); Console.WriteLine(string.Join("", conversion2)); } } }