এমন ভাষায় অত্যন্ত সংখ্যক লোককে পরিচালনা করা যা পারে না?


15

ভাষা নির্মাতারা যদি কোনও নির্দিষ্ট মানের চেয়ে বড় সংখ্যাকে পরিচালনা করতে অক্ষম হয় তবে আমি কীভাবে অত্যন্ত বড় সংখ্যায় (ইনফিনিটাম - ইন্টিজারগুলিতে কোনও ভাসা ভাসা) গণনা করতে যাব না সে সম্পর্কে আমি ভেবে দেখার চেষ্টা করছি।

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

আমি এর মতো একটি অ্যালগোরিদম স্কেচ করব:

  1. ভাষার জন্য পূর্ণসংখ্যের পরিবর্তনশীলের সর্বোচ্চ দৈর্ঘ্য নির্ধারণ করুন।

  2. একটি সংখ্যা যদি ভেরিয়েবলের সর্বাধিক দৈর্ঘ্যের অর্ধেকেরও বেশি দৈর্ঘ্য হয় তবে এটি এ্যারে বিভক্ত করুন। (একটু খেলার ঘর দিন)

  3. অ্যারের ক্রম [0] = ডানদিকে সবচেয়ে বেশি সংখ্যা [এন-ম্যাক্স] = বামে সর্বাধিক সংখ্যা

    যাত্রা। সংখ্যা: 29392023 অ্যারে [0]: 23, অ্যারে [1]: 20, অ্যারে [2]: 39, অ্যারে [3]: 29

যেহেতু আমি ভেরিয়েবলের অর্ধ দৈর্ঘ্যটি মার্ক অফ পয়েন্ট হিসাবে স্থাপন করেছি তারপরে আমি দশক, শততম ইত্যাদি গণনা করতে পারি অর্ধেক চিহ্নের মধ্য দিয়ে রাখুন যাতে যদি কোনও চলক সর্বাধিক দৈর্ঘ্য 0 থেকে 9999999999 পর্যন্ত 10 অঙ্ক হয় তবে আমি জানি যে অর্ধেক করে পাঁচটি অঙ্ক আমাকে কিছু খেলার ঘর দেয়।

সুতরাং আমি যদি যোগ বা গুণ করি তবে আমার একটি পরিবর্তনশীল চেকার ফাংশন থাকতে পারে যা দেখতে পাবে অ্যারের []] এর ষষ্ঠ সংখ্যা (ডান দিক থেকে) অ্যারে [1] এর প্রথম অঙ্কের (ডান দিক থেকে) একই স্থান।

বিভাজন এবং বিয়োগের নিজস্ব সমস্যা রয়েছে যা আমি এখনও ভাবিনি।

আমি প্রোগ্রামের চেয়ে বড় সংখ্যক সমর্থন করার সর্বোত্তম বাস্তবায়ন সম্পর্কে জানতে চাই।


1
প্রথম জিনিসটি যা মনে মনে আসে তা হ'ল জাভা'র বিগইন্টিজার: ডকস.অরাকল
ইভান

এটি কি এমন একটি ভাষা যা এখানকার যে কেউ জানতে এবং নির্দিষ্ট সুপারিশ করতে সক্ষম হতে পারেন, বা এটি কি অস্পষ্ট এবং মালিকানাধীন কিছু?
হতাশ

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

উত্তর:


25

আপনি যে ভাষার সাথে কাজ করছেন তার জন্য আপনি একটি স্বেচ্ছাসেবী নির্ভুল গণিত (যাকে "একাধিক নির্ভুলতা" বা "বড় সংখ্যা" বলা হয়) সন্ধান করছেন। উদাহরণস্বরূপ, আপনি যদি সি এর সাথে কাজ করছেন তবে আপনি জিএনইউ বিগনাম লাইব্রেরি -> http://gmplib.org/ ব্যবহার করতে পারেন

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


5
অবশ্যই "অঙ্ক" আপেক্ষিক, অনেক বিগনাম গ্রন্থাগারগুলি 256 বেস (স্বাক্ষরযুক্ত বাইট []) থেকে 2 ^ 64 (স্বাক্ষরযুক্ত দীর্ঘ []) তে ডিজিট ব্যবহার করে
র‌্যাচেট ফ্রিক

1
ঠিক বুঝেছি যে আমি বুঝতে পেরেছি, 'ডিজিট' কি বেজ 256 ডিজিটের অ্যারে হতে পারে? আমি মনে করি আমার ভুল হতে পারে, বেস ৮ 256 তে গণিত করা বেস বেস ৮৮ এর চেয়ে সহজ তবে এটি এখনও বেশ একটি কাজ ... (অন্তত যখন আমি কাগজ হাহাতে একটি শীট শেষ রাতে করেছি)
ম্যাল্লো

1
"বেস 886 এর চেয়ে 256 বেসে গণিত করা সহজ"। মিথ্যা। তারা সমান সহজ।
এস .লট

2
@ এস.লট: উম ... যখন আপনি বিটওয়াইজ অপারেশনগুলি উপলভ্য করবেন, তখন বেস ২ 25 on তে গণিত করা 88 বেসের চেয়ে অবশ্যই সহজ
জেসন এস

1
আপনার নিজের অ্যাড / বিয়োগ / গুণ বহুগুণ নির্মাণ মোটামুটি সোজা। বিভাগটি কঠিন, যদিও আপনি এটি বাইনারি প্রয়োগ না করে, যেখানে এটি শর্তাধীন বিয়োগ এবং বিট-শিফটিংয়ের অনুশীলন হয়ে ওঠে।
জেসন এস

13

এটি একটি সুপরিচিত সমস্যা: স্বেচ্ছাচারিত নির্ভুলতা পাটিগণিত

আপনি যে ভাষাটি ব্যবহার করছেন তা যখন এই সমস্যার সমাধান করে না, প্রথমে কোনও তৃতীয় পক্ষের লাইব্রেরিটি খুঁজে বের করার চেষ্টা করুন। যদি আপনি এটি খুঁজে না পান বা আপনি কৌতূহলী হন তবে এটি বাস্তবায়নের চেষ্টা করুন; উইকিপিডিয়া নিবন্ধটি শাস্ত্রীয় বাস্তবায়নের জন্য একটি ভাল উল্লেখ রয়েছে।


6

বিপুল সংখ্যার সাথে কাজ করার সময়, সম্ভবত সবচেয়ে মৌলিক নকশার সিদ্ধান্তগুলির মধ্যে একটি হ'ল আমি কীভাবে বড় সংখ্যার প্রতিনিধিত্ব করব?

এটি কি স্ট্রিং, একটি অ্যারে, একটি তালিকা বা কাস্টম (হোমগ্রাউন) স্টোরেজ ক্লাস হবে?

এই সিদ্ধান্ত নেওয়ার পরে, আসল গণিতের ক্রিয়াকলাপগুলি ছোট ছোট ভাগে ভাঙতে পারে এবং তারপরে ইনট বা পূর্ণসংখ্যার মতো স্থানীয় ভাষার ধরণ দিয়ে মৃত্যুদন্ড কার্যকর করা যায়।

আমি সি # তে একটি অত্যন্ত প্রাথমিক সংযোজন উদাহরণ অন্তর্ভুক্ত করেছি N নেট যা ফলাফলের বৃহত সংখ্যাকে একটি স্ট্রিং হিসাবে সংরক্ষণ করে stores ইনকামিং "নম্বর" স্ট্রিংও তাই খুব "বড়" সংখ্যা পাঠাতে সক্ষম হওয়া উচিত। মনে রাখবেন যে উদাহরণটি কেবল সম্পূর্ণ সংখ্যাগুলিকে সহজ রাখার জন্য।

এমনকি স্ট্রিংগুলির সাথে সংখ্যায় অক্ষর বা "সংখ্যার" একটি সীমা রয়েছে, এখানে এখানে নির্দেশিত হয়েছে:

.NET স্ট্রিংয়ের সর্বোচ্চ সম্ভাব্য দৈর্ঘ্য কত?

কিন্তু আপনি নেট 32 এর জন্য int32 বা int64 নেটিভ প্রকারের বাইরে কিছু সত্যিই বড় সংখ্যা যুক্ত করতে পারেন।

যাইহোক, এখানে স্ট্রিং স্টোরেজ বাস্তবায়ন।

/// <summary>
/// Adds two "integers".  The integers can be of any size string.
/// </summary>
/// <param name="BigInt1">The first integer</param>
/// <param name="BigInt2">The second integer</param>
/// <returns>A string that is the addition of the two integers passed.</returns>
/// <exception cref="Exception">Can throw an exception when parsing the individual parts     of the number.  Callers should handle. </exception>
public string AddBigInts(string BigInt1, string BigInt2)
{
    string result = string.Empty;

    //Make the strings the same length, pre-pad the shorter one with zeros
    int length = (BigInt1.Length > BigInt2.Length ? BigInt1.Length : BigInt2.Length);
    BigInt1 = BigInt1.PadLeft(length, '0');
    BigInt2 = BigInt2.PadLeft(length, '0');

    int remainder = 0;

    //Now add them up going from right to left
    for (int i = (BigInt1.Length - 1); i >= 0; i--)
    {
        //If we don't encounter a number, this will throw an exception as indicated.
        int int1 = int.Parse(BigInt1[i].ToString());
        int int2 = int.Parse(BigInt2[i].ToString());

        //Add
        int add = int1 + int2 + remainder;

        //Check to see if we need a remainder;
        if (add >= 10)
        {
            remainder = 1;
            add = add % 10;
        }
        else
        {
            remainder = 0;
        }

        //Add this to our "number"
        result = add.ToString() + result;
    }

    //Handle when we have a remainder left over at the end
    if (remainder == 1)
    {
        result = remainder + result;
    }

    return result;
}

আমি আশা করি এটি আপনার নিজের প্রয়োগ সম্পর্কে কিছু ধারণা দেয়। দয়া করে নোট করুন, নমুনা কোডটি সম্ভবত অপ্টিমাইজড বা এর মতো কিছু নয়। এটি কীভাবে এটি করা যায় তার কিছু ধারণা দেওয়ার জন্য।


Cool !! ধন্যবাদ এটি আমার কাছে অতিরিক্ত অতিরিক্ত কিছুটা জটিল করে ফেলবে বাকিদের সাথে পরিষ্কার জিনিসগুলি আপ করতে সহায়তা করে।
ম্যাল্লো

-2

এটি আমার জন্য দ্রুত কাজ করে:

static string Add(string a, string b)
        {
            string c = null;

            if (Compare(a, b) < 0)
            {
                c = a;
                a = b;
                b = c;
            }

            StringBuilder sb = new StringBuilder();

            b = b.PadLeft(a.Length, '0');

            int r = 0;

            for (int i = a.Length - 1; i >= 0; i--)
            {
                int part = a[i] + b[i] + r - 96;

                if (part <= 9)
                {
                    sb.Insert(0, part);

                    r = 0;
                }
                else
                {
                    sb.Insert(0, part - 10);

                    r = 1;
                }
            }

            if (r == 1)
            {
                sb.Insert(0, "1");
            }

            return sb.ToString();
        }

2
এই সাইটটি হল সম্পর্কে ধারণাগত প্রশ্ন ও উত্তর জিনিষ ব্যাখ্যা করার আশা করা যায়। ব্যাখ্যার পরিবর্তে কোড ডাম্প নিক্ষেপ করা আইডিই থেকে হোয়াইটবোর্ডে কোড অনুলিপি করার মতো: এটি পরিচিত এবং এমনকি কখনও কখনও বোধগম্য হতে পারে তবে এটি অদ্ভুত বোধ করে ... ঠিক অদ্ভুত। হোয়াইটবোর্ড কম্পাইলার নেই
মশা

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

Gnat সঙ্গে একমত। কমপক্ষে ডাম্পিং কোডের আগে অ্যালগরিদমটি ব্যাখ্যা করুন।
ফ্র্যাঙ্ক হিলিমান

কেবল কোনও ব্যাখ্যা ছাড়াই ডাম্পিং কোড হ'ল অনুলিপি-অতীত-গোপনকে উত্সাহ দেওয়ার মতো। সফ্টওয়্যারইঞ্জাইনারিংয়ে এটি কীভাবে কার্যকর হতে পারে তা আমি দেখছি না। স্ট্যাকওভারফ্লো হতে পারে তবে উভয় সাইটেরই সম্পূর্ণ ভিন্ন উদ্দেশ্য রয়েছে।
লাইভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.