سؤال

كيف يمكنني التعامل مع الأعداد الصحيحة الكبيرة في C #؟

لدي وظيفة من شأنها أن تعطيني نتاج المقسمة:

private static int GetDivisorProduct(int N, int product)
    {
        for (int i = 1; i < N; i++)
        {
            if (N % i == 0)
            {
                Console.WriteLine(i.ToString());
                product *= i;
            }
        }

        return product;
    }

وظيفة الدعوة هي GetDivisorProduct(N, 1)

إذا كانت النتيجة أكبر من 4 أرقام، يجب أن أحصل على آخر 4 أرقام فقط. (على سبيل المثال إذا أعطيت مدخلات من 957، فإن الإخراج 7493 بعد التشذيب فقط القيم الأربعة الأخيرة. والنتيجة الفعلية هي 876467493.).

مدخلات عينة أخرى: إذا أعطيت 10000، فإن الإخراج هو 0.

ال BigInteger تمت إزالة الفصل من مكتبة C #!

كيف يمكنني الحصول على آخر أربعة أرقام؟

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

المحلول

إذا كنت تبحث فقط في الأرقام الأربعة الأخيرة، فلن تحتاج إلى أي شيء أكبر من عدد صحيح. النظر في هذا:

عند ضرب رقمين، إذا كنت مهتما فقط بأرقام أقل أهمية (أي الأرقام الأربعة الأخيرة)، فإن معظم الأرقام العلوية لن يكون لها تأثير على أدنى أرقام من النتيجة ... حتى تتمكن من "يرمى"الأرقام الأكثر أهمية (الجانب الأيمن) قبل أن تضاعف.

على سبيل المثال: أريد أن أضرب عن رقمين كبيرين، لكنني بحاجة فقط إلى آخر رقمين:

int num1 = 123456789;
int num2 = 987654321;

int result = num1 * num2; // Last two digits would be "69" but this OVERFLOWS

ولكن إذا ضربنا فقط آخر رقمين ...

int result = (num1 % 100) * (num2 % 100);  // result = 89 * 21

89 * 21 = 1869 (آخر رقمين لا يزالان "69" ولكننا لم تفسد).

لقد استخدمت هذه التقنية لحساب ستة أرقام اليمين من 1،000،000 عام.

نصائح أخرى

.NET 4.0. لديه أ biginteger. صف دراسي

حسنا، يمكنك تعديل التعليمات البرمجية الخاصة بك مثل هذا:

    for (int i = 1; i < N; i++)
    {
        if (N % i == 0)
        {
            Console.WriteLine(i.ToString());
            product *= i;
        }
        if (product > 10000 * N)
        {
            product %= 10000;
        }
    }

وذلك لأن الأرقام الأربعة الأخيرة من (10000 * k + l)ص هي نفسها بالنسبة لR. النوع الفعلي من المنتج يعتمد على نطاق N الذي تريد التعامل معه. إذا كان كل شيء عدد صحيح، يجب أن يكون المنتج طويلا.

بالمناسبة، لماذا تمر المنتج كمعلمة، إذا كان دائما 1؟

ماذا عن محاولة استخدام ضعف أو طويل بدلا من int للمنتج؟ لن يعمل إلا في بعض الحالات، لكنه سيسمح لك بالعمل بأعداد أكبر تمكنت من ذلك.

آمل ألا أتفيد فهمت، لكنك تريد الكتابة في وحدة التحكم "0000" إذا كانت النتيجة 0؟ هل حاولت:

Console.WriteLine(i.ToString().PadLeft(4,"0")); 

?

إذا كان ما تريده هو الحصول على الرقم 0000 باعتباره int أنا آسف، لكن لا أعرف كيفية الحصول عليه.

إذا لم تتمكن من الذهاب إلى .NET 4.0 الآن، يمكنك استخدام Biginteger من مكتبة J # من C #. إليك مقالة تصف كيف. وبعد إنه ينشر التأثير الذي تحتاجه لنشر j # إعادة التوزيع.

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