سؤال

واني اسعى الى وضع عدد كبير في متغير وC ++. الرقم هو 600851475143

وحاولت غير الموقعة طويلة طويلة كثافة ولكن حصلت على خطأ قائلا انه ثابت وكبير جدا. وبعد ذلك حاول مكتبة BIGINT دعا BIGINT -> http://mattmccutchen.net/bigint/

والمشكلة هي أنني لا يمكن ترجمة التعليمات البرمجية كما أحصل على العديد من الأخطاء فيما يتعلق ليب.

والمرجعية غير معرفة ل`BigInteger :: BigInteger (الباحث) '<- الكثير من هذه

وهنا هو رمز بلادي حتى الآن:

#include "string"
#include "iostream"       
#include "bigint/NumberlikeArray.hh"
#include "bigint/BigUnsigned.hh"
#include "bigint/BigInteger.hh"
#include "bigint/BigIntegerAlgorithms.hh"
#include "bigint/BigUnsignedInABase.hh"
#include "bigint/BigIntegerUtils.hh"
using namespace std;

int main() {

    //unsigned long int num = 13195;
    //unsigned long long int num = 600851475143;
    BigInteger num = 13195;
    int divider = 2;

    //num = 600851475143;

    while (1) {
        if ((num % divider) == 0) {
            cout << divider << '\n';
            num /= divider;
        }
        else
            divider++;

        if (num == 1)
            break;
    }
}

إذا وضعت عددا أقل ولا تستخدم BIGINT ليب هذا البرنامج يعمل على ما يرام. أي مساعدة سوف تكون محل تقدير: D

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

المحلول

يمكنك تحديد عدد صحيح الحرفي طالما التي كتبها لاحقة L.
يمكنك تحديد عدد صحيح الحرفي طالما طويلة من قبل LL احقة.

#include <iostream>

int main()
{
    long long num = 600851475143LL;

    std::cout << num;
}

نصائح أخرى

والرقم هو 600851475143 ليست كبيرة جدا لفترة طويلة طويلة كثافة ولكن تحتاج إلى استخدام لاحقة LL عند استخدام الثوابت طويلة جدا (ULL لغير موقعة كثافة العمليات طويل):

unsigned long long int num = 600851475143ULL;

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

في حالة أعم عندما كنت لا يمكن أن يصلح رقمك في فترة طويلة طويلة، ويمكن أن يعيش مع رخصة GNU LGPL (<لأ href = "http://www.gnu.org/copyleft/lesser.html" يختلط = "نوفولو noreferrer"> http://www.gnu.org/copyleft/lesser.html )، أود أن أقترح تحاول Multiprecision مكتبة GNU (<لأ href = "http://gmplib.org/" يختلط = "نوفولو noreferrer"> http://gmplib.org/ ).

فهو سريع للغاية، وكتب في C ويأتي مع باردة جدا C ++ - المجمع مكتبة

هل هناك ليب BIGINT لربط في أو bigint.cpp لتجميع؟

إذا كنت تحصل أخطاء إشارة غير محددة للمكتبة bignum، وربما كنت لم يربط ذلك. على يونيكس، سيكون لديك لتمرير خيارا مثل -lbigint. إذا كنت تستخدم IDE، سيكون لديك للعثور على إعدادات رابط وإضافة المكتبة.

وأما بالنسبة للأرقام، كما سبق أن قال، تخلف مستمر الطبيعية لكثافة العمليات النوع. يجب استخدام LL / ليرة لبنانية للحصول على فترة طويلة طويلة.

وأول شيء يجب القيام به في هذه الحالة هو لمعرفة ما هو أكبر عدد أنك يمكن أن تندرج في غير موقعة طويلة طويلة. وبما أنه من 64 بت، فإن أكبر عدد هو 2 ^ 64-1 = 18446744073709551615، الذي هو أكبر من رقم هاتفك. ثم انت تعرف ان كنت تفعل شيئا خطأ، وأنت تنظر في الإجابة من طرف مارتن نيويورك لمعرفة كيفية إصلاحه.

وهذه محاولة واحدة. في الأساس يمكن أن يكون من الدرجة المخصصة الخاصة بك والذي يستخدم قائمة مرتبطة لتخزين عدد من حجم لانهائي. (RAM هو تقييد) جرب هذه https://mattmccutchen.net/bigint/

لأي شخص آخر وجود مشاكل مع هذه المكتبة بعد خمس سنوات من طرح هذا السؤال، وهذا هو الجواب لكم. لا يمكنك مجرد تجميع البرنامج، وسوف تفشل لربط مع وجود خطأ لا يمكن اختراقها القبيح! هذه المكتبة هي عبارة عن مجموعة من الملفات ج ++ التي من المفترض أن يجمع إلى .O الملفات وصلة ضده. اذا نظرتم الى إخراج ملف جعل توفير نموذج البرنامج سترى هذا:

g++ -c -O2 -Wall -Wextra -pedantic BigUnsigned.cc
g++ -c -O2 -Wall -Wextra -pedantic BigInteger.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerAlgorithms.cc
g++ -c -O2 -Wall -Wextra -pedantic BigUnsignedInABase.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerUtils.cc
g++ -c -O2 -Wall -Wextra -pedantic sample.cc
g++ sample.o BigUnsigned.o BigInteger.o BigIntegerAlgorithms.o BigUnsignedInABase.o BigIntegerUtils.o -o sample

واستبدال sample مع اسم البرنامج، لصق هذه السطور في makefile أو النصي، وتذهب بعيدا.

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