গুণকে সি # ব্যবহার না করে স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করা


9

গুণটি ব্যবহার না করে স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করার কোনও উপায় আছে কি? ইন্ট পার্স () এর প্রয়োগটিও গুণকে ব্যবহার করে। আমার অন্যান্য অনুরূপ প্রশ্ন রয়েছে যেখানে আপনি ম্যানুয়ালি স্ট্রিংটিকে ইনট-এ রূপান্তর করতে পারবেন, তবে এর জন্য এটির সংখ্যাটি 10 ​​এর দ্বারা বহুবৃত্ত করা দরকার This


3
(পাঠ্য) সাথে বা (শিরোনাম) ছাড়াই?
d4zed

2
আপনি কি স্পষ্ট করতে পারেন? আপনার শিরোনামটি 'ব্যবহার ছাড়াই' বলছে যখন আপনার পাঠ্যটি 'ব্যবহার করে' ব্যবহার করছে ...
বনলদী

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;
}

সাধারণভাবে আপনার নাল চেকগুলি, অন্যান্য অ-সংখ্যাযুক্ত অক্ষরের সমস্যা ইত্যাদির মতো অ্যাকাউন্টগুলিতে ত্রুটিগুলি নেওয়া উচিত etc.


6

এটা নির্ভর করে. আমরা কি গুণনের যৌক্তিক অপারেশন সম্পর্কে কথা বলছি, বা এটি আসলে হার্ডওয়্যারে কীভাবে সম্পাদিত হয়েছে?

উদাহরণস্বরূপ, আপনি একটি হেক্সাডেসিমাল (বা অষ্টাল, বা অন্য কোনও বেস দুটি গুণক) স্ট্রিংকে "গুণন ছাড়াই" পূর্ণসংখ্যায় রূপান্তর করতে পারেন। আপনি অক্ষর দ্বারা অক্ষরে যেতে পারেন |এবং অরিং ( <<) এবং বিটশিফিং ( ) রাখতে পারেন। এটি *অপারেটরটি ব্যবহার করা এড়িয়ে চলে ।

দশমিক স্ট্রিংয়ের সাহায্যে একই কাজ করা কৌশলযুক্ত, তবে আমাদের এখনও সহজ সংযোজন রয়েছে। আপনি একই জিনিসটি করতে লুপগুলি ব্যবহার করতে পারেন। খুব সহজ করতে। অথবা আপনি নিজের তৈরি করতে পারেন "গুণ টেবিল" - আশা করি আপনি স্কুলে সংখ্যাগুলি কীভাবে বানাবেন তা শিখেছেন; আপনি একটি কম্পিউটার দিয়ে একই জিনিস করতে পারেন। এবং অবশ্যই, আপনি যদি একটি দশমিক কম্পিউটারে থাকেন (বাইনারি পরিবর্তে) তবে আপনি "বিটশিফ্ট" করতে পারেন, ঠিক আগের হেক্সাডেসিমাল স্ট্রিংয়ের মতো। এমনকি বাইনারি কম্পিউটারের সাহায্যে আপনি বিট শিফটগুলির একটি সিরিজ ব্যবহার করতে পারেন - (a << 1) + (a << 3)একই a * 2 + a * 8 == a * 10। নেতিবাচক সংখ্যা সম্পর্কে যত্নশীল। এটিকে আকর্ষণীয় করার জন্য আপনি প্রচুর কৌশল অবলম্বন করতে পারেন।

অবশ্যই, এই দুটিই ছদ্মবেশে কেবল গুণ। এটা এ কারণে যে অবস্থানগত সাংখ্যিক সিস্টেম এর মজ্জাগতভাবে গুণনশীল । সেই নির্দিষ্ট সংখ্যার উপস্থাপনাটি কীভাবে কাজ করে। আপনার সরলিকরণ থাকতে পারে যা এই সত্যটিকে আড়াল করে (যেমন বাইনারি সংখ্যাগুলি কেবল প্রয়োজন 0এবং 1তাই গুণনের পরিবর্তে আপনার একটি সহজ শর্ত থাকতে পারে - অবশ্যই, আপনি যা করছেন তা এখনও কেবলমাত্র দুটি সম্ভাব্য ইনপুট এবং দুটি সম্ভাব্য ইনপুট দিয়ে গুণ করা হচ্ছে আউটপুটস), তবে লুকানো থাকে always অপারেশনটি করে এমন হার্ডওয়্যারটি সহজ এবং / বা দ্রুততর হতে পারে এমনকি <<তার মতোই * 2

সম্পূর্ণরূপে গুণনের সাথে দূরে রাখতে, আপনাকে একটি অবস্থানিক সিস্টেম ব্যবহার করা এড়ানো উচিত। উদাহরণস্বরূপ, রোমান সংখ্যাসমূহ যুত (নোট যে প্রকৃত রোমান সংখ্যাসমূহ compactification নিয়ম আমরা আজ ব্যবহার করেননি - চার হবে হয় IIII, না IV, এবং এটি চৌদ্দ মত কোন ফর্ম লেখা যেতে পারে XIIII, IIIIX, IIXII, VVIIIIইত্যাদি)। এ জাতীয় স্ট্রিংটিকে পূর্ণসংখ্যায় রূপান্তর করা খুব সহজ হয়ে যায় - কেবল চরিত্র অনুসারে অক্ষরে যান এবং যুক্ত করে যান। চরিত্রটি হলে Xদশটি যোগ করুন। যদি V, পাঁচ যোগ করুন। যদিI, এক যোগ কর. আমি আশা করি আপনি এতদিন কেন রোমান সংখ্যাগুলি জনপ্রিয় ছিলেন; অবস্থানিক সংখ্যাসূচক সিস্টেমগুলি দুর্দান্ত হয় যখন আপনাকে প্রচুর গুণ এবং বিভাগ করার প্রয়োজন হয়। আপনি যদি মূলত সংযোজন এবং বিয়োগফল নিয়ে কাজ করেন তবে রোমান সংখ্যাগুলি দুর্দান্ত কাজ করে এবং এর জন্য অনেক কম স্কুলিংয়ের প্রয়োজন হয় (এবং একটি অ্যাবাকাস একটি অবস্থানগত ক্যালকুলেটরের তুলনায় তৈরি এবং ব্যবহার করা অনেক সহজ!)।

এই জাতীয় কার্যভার সহ, সাক্ষাত্কারকারী আসলে কী প্রত্যাশা করে সে সম্পর্কে অনেকগুলি হিট এবং মিস রয়েছে। হতে পারে তারা কেবল আপনার চিন্তার প্রক্রিয়াগুলি দেখতে চায়। আপনি পরিভাষা (আলিঙ্গন না <<নয় সত্যিই গুণ)? আপনি কি নম্বর তত্ত্ব এবং কম্পিউটার বিজ্ঞান জানেন? আপনি কি কেবল আপনার কোড দিয়ে ডুবিয়ে রেখেছেন, বা স্পষ্টতা চান? আপনি কি এটি একটি মজাদার চ্যালেঞ্জ হিসাবে দেখেন, বা অন্য একটি হাস্যকর বিরক্তিকর সাক্ষাত্কারের প্রশ্ন যা আপনার চাকরির সাথে কি কোনও প্রাসঙ্গিকতা নেই? আমাদের পক্ষে সাক্ষাত্কারকারীর যে উত্তরটি সন্ধান করা হয়েছিল তা জানানো আমাদের পক্ষে অসম্ভব।

তবে আমি আশা করি আমি কমপক্ষে আপনাকে সম্ভাব্য উত্তরের এক ঝলক দিলাম :)


যদি আমরা রোমান সংখ্যা সিস্টেমটি ব্যবহার করি তবে আমাদের কাছে বি, টি, এস, আর, জি, এ ইত্যাদি চরিত্র থাকলে রোম সংখ্যা ব্যবস্থার অংশ না হলে আপনি কীভাবে যুক্ত করবেন? অন্য কথায়, কীভাবে একটি সমমানের সমতুল্য হবে?
আদিশ

@ আদিশ আপনি কী সম্পর্কে জিজ্ঞাসা করার চেষ্টা করছেন তা আমার কোনও ধারণা নেই। আপনি কি সমস্যা মনে করেন তার উদাহরণ দিতে পারেন?
লুয়ান

ধরুন আমাদের কাছে একটি স্ট্রিং রয়েছে "12345" এবং আমরা এটিকে একটি ইন্টিতে রূপান্তর করতে চাই। আমি যদি অবস্থানিক সংখ্যাসূচক সিস্টেমটি ব্যবহার না করে তার পরিবর্তে রোমান সংখ্যা সিস্টেমটি ব্যবহার করতে চাই না তবে কী হবে। আমরা কীভাবে এটি করতে পারি? (আমি মোটেও গুণটি ব্যবহার করতে চাই না)
আদিশ

@ আধেশ একটি রোমান অঙ্ক পদ্ধতিতে, স্ট্রিংটি "12345" হবে না। এই হল ব্যপার. অবস্থানগত সংখ্যা সংক্রান্ত সিস্টেমগুলি সহজাত গুণক হয়। রোমান সংখ্যা সিস্টেমটি যুক্ত itive রোমান স্ট্রিংটি "এমএমএমএমএমএমএমএমএমএমএমএমসিসিএমএক্সএক্সএক্সএক্সএক্সএক্সআইআইআইআইআই" এর মতো কিছু হবে। চরিত্র অনুসারে অক্ষরে যান, এবং সংখ্যা যুক্ত রাখুন।
লুয়ান

@ আধেশ অবশ্যই বাস্তব ব্যবহারিক বাস্তবতায় এটি এত দীর্ঘ অনর্থক জগাখিচুড়ি হবে না। "12345 মিটার" এর পরিবর্তে আপনি "XII কিলো এবং সিসিসিএক্সএক্সএক্সএক্সএক্সএক্সআইআইআইআইআইআই মিটার" এর মতো কিছু বলতে পারেন। পুরানো পরিমাপ সিস্টেমগুলি এমন লোকদের সাথে অভিযোজিত হয়েছিল যারা বেশি পরিমাণে গণনা করতে পারেন না - কেবলমাত্র আপনি যদি বারোতে গণনা করতে পারেন তবে কেবলমাত্র সাম্রাজ্যীয় ইউনিটগুলির সাথে আধুনিক ইউনিটগুলির সাথে আপনি যে মানগুলি উপস্থাপন করতে পারবেন তার পরিসীমা তুলনা করুন :)
লুয়ান

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
উজ্জ্বল: পি কেবল নিশ্চিত হয়ে নিন যে ইন্টারভিউয়ারের তাত্ক্ষণিক প্রতিক্রিয়া না থাকলে আপনি এটি ব্যবহার করছেন না, যদিও: ডিআই ধারণা করেন যে একই বেসিক পদ্ধতির সাহায্যে আংশিক ম্যাচগুলির সাথে পারফরম্যান্সের উন্নতি করার উপায়ও রয়েছে। খুব কমপক্ষে, নেতিবাচক সংখ্যার জন্য একটি সহজ চেক আপনাকে অর্ধেক লুপ বাঁচায়; বিজোড় / এমনকি অন্য অর্ধেকের জন্য একটি চেক।
লুয়ান

@ লুয়ান আমি যতটা সম্ভব কম লাইনে এটি করতে চেয়েছিলাম :) ...public int StringToInt(string value, int search_from = int.MinValue) => value == search_from.ToString() ? search_from : StringToInt (value, ++search_from);
এনএল-এক্স

দুঃখজনকভাবে, এটি বিস্ফোরিত হতে চলেছে: ডি তবে কোডটি কাগজে লেখার জন্য এটি দুর্দান্ত সমাধান - এটি এটিকে খুব স্পষ্টতই সঠিক করে তোলে, এবং ভুল লিখতেও কষ্ট হয়। আপনি 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;
}

পারফরম্যান্স এখানে উদ্বেগ বলে মনে হয় না বলে আমি মনে করি না যে এটি সমস্যার জন্য উপযুক্ত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.