طريقة فعالة لمعالجة القوى الكبيرة من اثنين
-
04-10-2019 - |
سؤال
الطريقة الأكثر فعالية لسلطات رمز اثنين هي عن طريق التحول بتدبير الأعداد الصحيحة.
1 << n
يعطيني 2^n
ومع ذلك ، إذا كان لدي رقم أكبر من أكبر قيمة مسموح بها في int
أو أ long
, ، ما الذي يمكنني استخدامه للتلاعب بكفاءة 2؟
(أحتاج إلى أن أكون قادرًا على إجراء عمليات الإضافة والضرب والقسمة والمعامل على الرقم)
المحلول
هل هذا ما تحتاجه؟
BigInteger hugeNumber = BigInteger.ONE.shiftLeft(n);
هذه هي النتيجة عندما ن = 1000 ،
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
نصائح أخرى
ما هي العمليات التي تحتاج إلى القيام بها على "قوى اثنين"؟ إذا كان الانقسام والضرب فقط ، على سبيل المثال ، يمكنك الاحتفاظ بـ log2
من صلاحيات اثنين في السؤال ، واستخدم الطرح والإضافة عليها بدلاً من ذلك. دون معرفة ماذا أنواع من "التلاعب" الذي تريده ، من المستحيل تقديم اقتراحات جيدة حول كيفية ذلك بكفاءة "معالجة"؛-).
سهل: long
:-)
إذا كنت لا تمانع في النقطة العائمة ، double
يمكن أن تمثل بالضبط جميع صلاحيات 2 حتى 2^1023.
خلاف ذلك ، يعتمد ذلك على نوع "التلاعب" الذي تفعله.
يشبه java.math.BigInteger
هو ما تحتاجه.
لديها mod
, shiftLeft
, shiftRight
, ، وبالطبع add
, multiply
, subtract
و divide
. إنه نوع غير قابل للتغيير (علاء String
) ، لذلك ربما لا تكون الطريقة الأكثر فعالية في فعل الأشياء ، ولكن ما لم تكن قد حددتها على أنها مشكلة في الأداء ، فلن أقلق بشأنها.
هل يجب أن تكون دقيقة؟
وإلا ، يمكنك التمثيل كما هو مضروب طويل من قبل اثنين لقوة int.
مثال:
x = 15 * 2^123