سؤال

الطريقة الأكثر فعالية لسلطات رمز اثنين هي عن طريق التحول بتدبير الأعداد الصحيحة.

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

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