गुणन C # का उपयोग किए बिना स्ट्रिंगर को पूर्णांक में परिवर्तित करना


9

क्या गुणन का उपयोग किए बिना स्ट्रिंग को पूर्णांक में बदलने का एक तरीका है। Int.Parse () का कार्यान्वयन गुणन का भी उपयोग करता है। मेरे पास इसी तरह के अन्य प्रश्न हैं जहां आप मैन्युअल रूप से स्ट्रिंग को इंट में परिवर्तित कर सकते हैं, लेकिन इसके आधार द्वारा संख्या को mulitiplying की आवश्यकता है। यह एक साक्षात्कार का प्रश्न था जो मैंने एक साक्षात्कार में किया था और मुझे इस बारे में कोई उत्तर नहीं मिला।


3
(पाठ) या बिना (शीर्षक) के साथ?
4

2
क्या आप स्पष्ट कर सकते हैं? आपका शीर्षक 'बिना' का उपयोग करते हुए कहता है, जबकि आपका पाठ 'प्रयोग के साथ' कहता है ...
vonludi

1
प्रश्न की बाकी सामग्री (उदाहरण के लिए "लेकिन यह भी कि इसके आधार 10 की संख्या को गुणा करना आवश्यक है) को देखते हुए, शीर्षक सही है। इसके अलावा, अगर गुणा की अनुमति है तो यह तुच्छ है, इसलिए इसे पूछने का कोई मतलब नहीं होगा।
जॉन

7
यह लेख बिट-शिफ्ट और जोड़ ( x<<1 + x<<3) के साथ गुणन को दस से बदलने का सुझाव देता है , लेकिन यह अभी भी गुणा का उपयोग करने का एक तरीका है, इसलिए यह कहना कठिन है कि क्या यह "आत्मा की" प्रश्न में है ...
साइमन म्केंजी

3
for (int i = 0; i < 10; i++) result += number;गिनती करता है?
छावनी 7

जवाबों:


12

यदि आप आधार -10 नंबर प्रणाली को मानते हैं और बिट शिफ्ट्स द्वारा गुणन को प्रतिस्थापित करते हैं ( यहाँ देखें ) यह सकारात्मक पूर्णांक के लिए एक समाधान हो सकता है ।

public int StringToInteger(string value)
{
    int number = 0;
    foreach (var character in value)
        number = (number << 1) + (number << 3) + (character - '0');

    return number;
}

आइडोन पर उदाहरण देखें

केवल धारणा है कि वर्ण है '0'करने के लिए '9'सीधे अक्षर समूह में एक दूसरे के बगल झूठ बोलते हैं। अंकों-वर्णों का उपयोग करके उनके पूर्णांक मान में बदल दिया जाता है character - '0'

संपादित करें:

के लिए नकारात्मक पूर्णांक इस संस्करण ( यहाँ देखें ) काम करता है।

public static int StringToInteger(string value)
{
    bool negative = false;
    int i = 0;

    if (value[0] == '-')
    {
        negative = true;
        ++i;
    }

    int number = 0;
    for (; i < value.Length; ++i)
    {
        var character = value[i];
        number = (number << 1) + (number << 3) + (character - '0');
    }

    if (negative)
        number = -number;
    return number;
}

सामान्य तौर पर आपको त्रुटियों को ध्यान में रखना चाहिए जैसे अशक्त जांच, अन्य गैर-संख्यात्मक वर्णों की समस्याएं आदि।


6

निर्भर करता है। क्या हम गुणा के तार्किक संचालन के बारे में बात कर रहे हैं, या यह वास्तव में हार्डवेयर में कैसे किया जाता है?

उदाहरण के लिए, आप एक हेक्साडेसिमल (या ऑक्टल, या किसी अन्य आधार दो गुणक) स्ट्रिंग को "गुणन के बिना" पूर्णांक में बदल सकते हैं। आप चरित्र द्वारा चरित्र जा सकते हैं और ओरिंज ( |) और बिटशिफ्टिंग ( <<) रख सकते हैं । यह *ऑपरेटर का उपयोग करने से बचता है ।

दशमलव तार के साथ ऐसा ही करना मुश्किल है, लेकिन हमारे पास अभी भी सरल जोड़ है। आप एक ही काम करने के अलावा छोरों का उपयोग कर सकते हैं। करने के लिए बहुत आसान है। या आप अपनी खुद की "गुणन तालिका" बना सकते हैं - उम्मीद है कि आपने स्कूल में संख्याओं को गुणा करने का तरीका सीखा; आप एक कंप्यूटर के साथ एक ही काम कर सकते हैं। और हां, अगर आप एक दशमलव कंप्यूटर (बाइनरी के बजाय) पर हैं, तो आप "बिटशिफ्ट" कर सकते हैं, जैसे पहले के हेक्साडेसिमल स्ट्रिंग के साथ। बाइनरी कंप्यूटर के साथ भी, आप बिटशिफ्ट्स की एक श्रृंखला का उपयोग कर सकते हैं - (a << 1) + (a << 3)जैसा कि है a * 2 + a * 8 == a * 10। नकारात्मक संख्या के बारे में सावधान। इसे दिलचस्प बनाने के लिए आप बहुत सारे ट्रिक कर सकते हैं।

बेशक, ये दोनों ही भेस में गुणा हैं। ऐसा इसलिए है क्योंकि स्थितिगत संख्यात्मक प्रणाली स्वाभाविक रूप से गुणक हैं । इस तरह से यह विशेष रूप से संख्यात्मक प्रतिनिधित्व काम करता है। आपके पास सरलीकरण हो सकते हैं जो इस तथ्य को छिपाते हैं (जैसे बाइनरी नंबर की केवल आवश्यकता होती है 0और 1इसलिए, गुणा करने के बजाय, आपके पास एक साधारण शर्त हो सकती है - बेशक, आप जो कर रहे हैं वह वास्तव में अभी भी गुणा है, सिर्फ दो संभावित इनपुट और दो संभव के साथ आउटपुट), लेकिन यह हमेशा वहाँ है, गुप्त। <<वैसे ही है * 2, भले ही ऑपरेशन करने वाला हार्डवेयर सरल और / या तेज हो।

पूरी तरह से गुणन के साथ दूर करने के लिए, आपको एक स्थिति प्रणाली का उपयोग करने से बचने की आवश्यकता है। उदाहरण के लिए, रोमन अंकों additive (ध्यान दें कि वास्तविक रोमन अंकों compactification नियम हम आज का उपयोग नहीं किया - चार हो जाएगा IIII, नहीं IV, और यह चौदह की तरह किसी भी रूप में लिखा जा सकता है XIIII, IIIIX, IIXII, VVIIIIआदि)। इस तरह के स्ट्रिंग को पूर्णांक में बदलना बहुत आसान हो जाता है - बस चरित्र द्वारा चरित्र जाओ, और जोड़ते रहो। यदि चरित्र है X, तो दस जोड़ें। यदि V, पाँच जोड़ें। अगरI, एक जोड़ें। मुझे आशा है कि आप देख सकते हैं कि रोमन अंक इतने लंबे समय तक लोकप्रिय क्यों रहे; जब आप कई गुणा और विभाजन करने की आवश्यकता होती है, तो स्थितिज संख्यात्मक प्रणाली अद्भुत होती है। यदि आप मुख्य रूप से जोड़ और घटाव के साथ काम कर रहे हैं, तो रोमन अंक बहुत अच्छा काम करते हैं, और बहुत कम स्कूली शिक्षा की आवश्यकता होती है (और एक स्थिति कैलकुलेटर की तुलना में एबैकस बनाना और उपयोग करना बहुत आसान है!)।

इस तरह के असाइनमेंट के साथ, साक्षात्कारकर्ता वास्तव में क्या उम्मीद करता है, इसके बारे में बहुत हिट और याद आती है। शायद वे सिर्फ आपकी सोची हुई प्रक्रियाओं को देखना चाहते हैं। क्या आप तकनीकीताओं को गले लगाते हैं (क्या वास्तव में गुणा <<नहीं है)? क्या आप संख्या सिद्धांत और कंप्यूटर विज्ञान जानते हैं? क्या आप केवल अपने कोड के साथ आगे बढ़ते हैं, या स्पष्टीकरण मांगते हैं? क्या आप इसे एक मजेदार चुनौती के रूप में देखते हैं, या फिर एक और हास्यास्पद उबाऊ साक्षात्कार प्रश्न के रूप में जो आपकी नौकरी क्या है, इसकी कोई प्रासंगिकता नहीं है? हमारे लिए यह बताना असंभव है कि साक्षात्कारकर्ता जिस उत्तर की तलाश कर रहा था।

लेकिन मुझे उम्मीद है कि मैंने कम से कम आपको संभावित उत्तरों की एक झलक दी :)


यदि हम रोमन अंक प्रणाली का उपयोग करते हैं, तो आप कैसे जोड़ेंगे यदि हमारे पास B, T, S, R, G, A आदि वर्ण हैं जो रोमन अंक प्रणाली का हिस्सा नहीं हैं। दूसरे शब्दों में, एक इंट के बराबर कैसे मिलेगा?
अधिशेश

@ ऐडिश मुझे कोई अंदाजा नहीं है कि आप किस बारे में पूछना चाह रहे हैं। क्या आप एक उदाहरण दे सकते हैं जो आपको लगता है कि एक समस्या होगी?
लूआना

मान लीजिए कि हमारे पास एक स्ट्रिंग है "12345" और हम इसे एक इंट में बदलना चाहते हैं। क्या होगा यदि मैं स्थितिगत संख्यात्मक प्रणाली का उपयोग नहीं करना चाहता हूं और इसके बजाय रोमन अंक प्रणाली का उपयोग करना चाहता हूं। हम इसे कैसे कर सकते थे? (मैं गुणा का उपयोग बिल्कुल नहीं करना चाहता)
आशीष

@ Adheesh एक रोमन अंक प्रणाली में, स्ट्रिंग "12345" नहीं होगी। यह पूरी बात है। स्थितिगत संख्यात्मक प्रणाली स्वाभाविक रूप से गुणक हैं। रोमन अंक प्रणाली योगात्मक है। रोमन स्ट्रिंग कुछ इस तरह होगा "MMMMMMMMMMMMCCXXXXIIIII"। चरित्र से चरित्र जाओ, और संख्याओं को जोड़ते रहो।
लुआं

@ Adheesh बेशक, वास्तविक व्यावहारिक वास्तविकता में, यह इतनी लंबी बेईमान गड़बड़ नहीं होगी। "12345 मीटर" के बजाय, आप "XII किलो और CCCXXXXIIIII मीटर" या ऐसा कुछ कहेंगे। पुरानी माप प्रणालियों को ऐसे लोगों के लिए अनुकूलित किया गया था जो अधिक गिनती नहीं कर सकते थे - बस उन मूल्यों की श्रेणी की तुलना करें जिन्हें आप आधुनिक इकाइयों के लिए शाही इकाइयों के साथ प्रतिनिधित्व कर सकते हैं यदि आप केवल बारह तक गिनती कर सकते हैं :)
लुआना

5

इसे साक्षात्कार का प्रश्न मानते हुए, प्रदर्शन एक उच्च प्राथमिकता नहीं हो सकती है। सिर्फ क्यों नहीं:

private int StringToInt(string value)
{
    for (int i = int.MinValue; i <= int.MaxValue; i++)
        if (i.ToString() == value)
            return i;
    return 0; // All code paths must return a value.
}

यदि पारित स्ट्रिंग पूर्णांक नहीं है, तो विधि एक अतिप्रवाह अपवाद फेंक देगी।


1
शानदार: P बस सुनिश्चित करें कि आप इसका उपयोग नहीं करते हैं अगर साक्षात्कारकर्ता की कोई तत्काल प्रतिक्रिया नहीं है, हालांकि: DI की कल्पना है कि एक ही मूल दृष्टिकोण का उपयोग करके आंशिक मैचों के साथ प्रदर्शन में सुधार करने के तरीके भी हो सकते हैं। बहुत कम से कम, नकारात्मक संख्याओं के लिए एक सरल जांच आपको आधा लूप बचाता है; विषम / और भी आधे के लिए एक चेक।
दोपहर

@ Luaan मैं इसे यथासंभव छोटी लाइनों में करना चाहता था :) ...public int StringToInt(string value, int search_from = int.MinValue) => value == search_from.ToString() ? search_from : StringToInt (value, ++search_from);
nl-x

अफसोस की बात है कि यह विस्फोट हो रहा है: डी लेकिन यह कागज पर कोड लिखने के लिए एक महान समाधान है - यह बहुत स्पष्ट रूप से सही बनाता है, और गलत लिखना मुश्किल है। आप LIINQ का उपयोग भी कर सकते हैं - Enumerable.Range(int.MinValue, int.MaxValue).First(i => i.ToString() == stringValue
लुआं

0

किसी भी गुणन को बार-बार जोड़कर बदला जा सकता है। तो आप किसी भी मौजूदा एल्गोरिथम को किसी ऐसे वर्जन से बदल सकते हैं जिसमें केवल एक वर्जन हो:

static int Multiply(int a, int b)
{
    bool isNegative = a > 0 ^ b > 0;
    int aPositive = Math.Abs(a);
    int bPositive = Math.Abs(b);
    int result = 0;
    for(int i = 0; i < aPositive; ++i)
    {
        result += bPositive;
    }
    if (isNegative) {
        result = -result;
    }
    return result;
}

आप आगे जा सकते हैं और इस विचार का उपयोग करते हुए एक विशेष स्ट्रिंग टू इंट लिख सकते हैं जो अतिरिक्त संख्या (ऋणात्मक संख्या और संक्षिप्तता के लिए छोड़ी गई त्रुटि से निपटने) को कम करता है:

static int StringToInt(string v)
{
    const int BASE = 10;
    int result = 0;
    int currentBase = 1;
    for (int digitIndex = v.Length - 1; digitIndex >= 0; --digitIndex)
    {
        int digitValue = (int)Char.GetNumericValue(v[digitIndex]);
        int accum = 0;
        for (int i = 0; i < BASE; ++i)
        {
            if (i == digitValue)
            {
                result += accum;
            }
            accum += currentBase;
        }
        currentBase = accum;
    }
    return result;
}

लेकिन मुझे नहीं लगता कि यह प्रदर्शन के लायक नहीं है क्योंकि प्रदर्शन यहाँ चिंता का विषय नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.