سؤال

وأنا أحاول أن العمل من خلال المشاكل على projecteuler.net لكن أظل على التوالي في بعض المشاكل.

والأول هو مسألة تخزين QUANITIES كبيرة من العناصر في List<t>. وأظل الحصول على OutOfMemoryException عندما تخزين كميات كبيرة في القائمة.

والآن أعترف أنني قد لا يكون فعل هذه الأشياء في أفضل وسيلة، ولكن هناك طريقة ما لتحديد مقدار الذاكرة التطبيق يمكن أن تستهلك؟

وعادة ما تحطم عندما أحصل على العبور 100،000،000 عناصر: S

وثانيا، بعض الأسئلة تتطلب إضافة أعداد هائلة. يمكنني استخدام نوع البيانات ULONG حيث أعتقد أن العدد سيرتفع إلى الحصول على السوبر كبيرة، ولكن أنا لا تزال إدارة للالتفاف الماضي أكبر كثافة العمليات بدعم والدخول في الأرقام السالبة.

هل لديك أي نصائح للعمل مع أعداد كبيرة بشكل لا يصدق؟

هل كانت مفيدة؟

نصائح أخرى

وتحتاج إلى استخدام فئة عدد كبير يستخدم بعض مديري الرياضيات الأساسية لتقسيم هذه العمليات حتى. هذا مكتبة C # BigInteger على CodePoject أن تكون أكثر واعدة. في مقال له بعض التفسيرات جيدة عن كيفية العمليات مع الأرقام العمل الضخم، كذلك.

وانظر أيضا: صحيحة كبيرة في C #

وبقدر ما يذهب مشروع أويلر، هل يمكن أن ينبح حتى الشجرة خاطئة إذا كنت ضرب استثناءات OutOfMemory. من موقعه على الانترنت:

<اقتباس فقرة>   

تم تصميم كل مشكلة وفقا ل"الحكم دقيقة واحدة"، مما يعني أنه على الرغم من أنه قد يستغرق عدة ساعات لتصميم خوارزمية ناجحة مع مشاكل أكثر صعوبة، والتنفيذ الفعال سيسمح حل ليتم الحصول على متواضعة تعمل بالطاقة الكمبيوتر في أقل من دقيقة واحدة.

وكما قال المستعمل Jakers، إذا كنت تستخدم أرقام كبيرة، وربما كنت أفعل ذلك الخطأ.

ومن المشاكل ProjectEuler فعلت، أيا كان يتطلب-عدد كبير الرياضيات حتى الآن. على نحو أكثر حول العثور على الخوارزمية المناسبة لتجنب أعداد كبيرة.

وتريد تلميحات؟ أضف هنا، ونحن قد يكون بدأ مثيرة للاهتمام يولر الخيط.

وأفترض هذا C #؟ وقد بنيت F # في سبل التعامل مع كل هذه المشاكل (نوع BIGINT وتسلسل كسول).

ويمكنك استخدام كل التقنيات # F من C #، إذا أردت. نوع BIGINT قابل للاستخدام معقول من لغات أخرى إذا قمت بإضافة إشارة إلى جوهر F # التجمع.

وتسلسل كسول هي في الأساس مجرد تركيب العدادين ودية. وضع 100000000 العناصر في القائمة ليست خطة عظيمة، لذلك يجب إعادة النظر في الحلول الخاصة بك للالتفاف حول ذلك. إذا كنت لا تحتاج للحفاظ على المعلومات حولها، ورميها بعيدا! إذا كان أرخص لإعادة حساب ذلك من تخزينه، ورميها بعيدا!

وانظر الإجابات في هذا <وأ href = "https://stackoverflow.com/questions/262025/how-do-you-do-maths-or-math-with-numbers-bigger-than-maxvalue-in -c "> موضوع . ربما تحتاج إلى استخدام واحدة من طرف ثالث كبيرة المكتبات صحيح / الطبقات المتاحة أو الانتظار لC # 4.0 والتي سوف تشمل BigInteger نوع البيانات الأصلي.

وبقدر ما تحدد مقدار الذاكرة سوف تستخدم أحد التطبيقات، يمكنك التحقق من الذاكرة المتوفرة قبل إجراء العملية باستخدام في MemoryFailPoint الصف.

وهذا يسمح لك preallocate الذاكرة قبل القيام العملية، حتى تتمكن من معرفة ما اذا كان سوف تفشل عملية قبل تشغيله.

وأنت لا تحتاج إلى استخدام BigInteger يمكنك القيام بذلك الحدث مع مجموعة سلسلة من الأرقام.

class Solution
{

    static void Main(String[] args)
    {
        int n = 5;
        string[] unsorted = new string[6] { "3141592653589793238","1", "3", "5737362592653589793238", "3", "5" };

        string[] result = SortStrings(n, unsorted);

        foreach (string s in result)
            Console.WriteLine(s);
        Console.ReadLine();
    }
    static string[] SortStrings(int size, string[] arr)
    {

        Array.Sort(arr, (left, right) =>
        {

            if (left.Length != right.Length)
                return left.Length - right.Length;
            return left.CompareTo(right);
        });

        return arr;
    }
}
string Add(string s1, string s2)
{
        bool carry = false;
        string result = string.Empty;

        if (s1.Length < s2.Length)
            s1 = s1.PadLeft(s2.Length, '0');
        if(s2.Length < s1.Length)
            s2 = s2.PadLeft(s1.Length, '0');

        for(int i = s1.Length-1; i >= 0; i--)
        {
            var augend = Convert.ToInt64(s1.Substring(i,1));
            var addend = Convert.ToInt64(s2.Substring(i,1));
            var sum = augend + addend;
            sum += (carry ? 1 : 0);
            carry = false;
            if(sum > 9)
            {
                carry = true;
                sum -= 10;
            }
            result = sum.ToString() + result;
        }
        if(carry)
        {
            result = "1" + result;
        }

    return result;
}

ولست متأكدا إذا كان هذا هو وسيلة جيدة للتعامل مع ذلك، ولكن يمكنني استخدام التالية في مشروعي.

ولدي "theRelevantNumber المزدوج" متغير و "الباحث PowerOfTen" لكل عنصر وصفي ذات الصلة لدي "كثافة العمليات relevantDecimals" متغير.

وهكذا ... عند مواجهة الأعداد الكبيرة والتعامل معها من هذا القبيل:

أولا تم تغييرها إلى x، شكل ص ص ص. حتى إذا كان عدد 123456.789 وقد تم إدخاله و "powerOfTen" 10، أنها ستبدأ من هذا القبيل:

وtheRelevantNumber = 123456.789 PowerOfTen = 10 وكان عدد ثم: 123456،789 * 10 ^ 10

وبعد ذلك يتم تغييره إلى: 1،23456789 * 10 ^ 15

وبعد ذلك يتم تقريب من قبل عدد من الكسور العشرية ذات الصلة (على سبيل المثال 5) إلى 1،23456 ثم حفظها جنبا إلى جنب مع "PowerOfTen = 15"

عند إضافة أو subracting الأرقام معا، ويتم تجاهل أي عدد خارج العشرية ذات الصلة. يعني إذا كنت تأخذ:

1 * 10 ^ 15 + 1 * 10 ^ 10 فإنه سوف تتغير إلى 1،00001 إذا "relevantDecimals" هو 5 ولكن لن يتغير على الإطلاق إذا "relevantDecimals" هي 4.

وهذه الطريقة تجعلك قادرة على التعامل مع الأرقام حتى doubleLimit * 10 ^ intLimit دون أي مشكلة، وعلى الأقل لOOP أنه ليس من الصعب أن تتبع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top