java - كيف يمكنني تحويل سلسلة إلى BigInteger؟




string (5)

أحاول قراءة بعض الأرقام الكبيرة حقًا من الإدخال القياسي وإضافتها معًا.

ومع ذلك ، لإضافة إلى BigInteger ، أحتاج إلى استخدام BigInteger.valueOf(long); :

private BigInteger sum = BigInteger.valueOf(0);

private void sum(String newNumber) {
    // BigInteger is immutable, reassign the variable:
    sum = sum.add(BigInteger.valueOf(Long.parseLong(newNumber)));
}

التي تعمل بشكل جيد ، ولكن كما BigInteger.valueOf() long فقط ، لا أستطيع إضافة أرقام أكبر من قيمة الحد الأقصى الطويل (9223372036854775807).

كلما حاولت إضافة 9223372036854775808 أو أكثر ، أحصل على NumberFormatException (وهو متوقع بالكامل).

هل هناك شيء من هذا القبيل BigInteger.parseBigInteger(String) ؟


Answers

باستخدام المنشئ

BigInteger (String val)

يترجم تمثيل سلسلة عشري ل BigInteger إلى BigInteger.

Javadoc


للحلقة حيث تريد تحويل array من strings إلى array من bigIntegers يلي:

String[] unsorted = new String[n]; //array of Strings
BigInteger[] series = new BigInteger[n]; //array of BigIntegers

for(int i=0; i<n; i++){
    series[i] = new BigInteger(unsorted[i]); //convert String to bigInteger
}

BigInteger لديه منشئ حيث يمكنك تمرير سلسلة كوسيطة.

حاول أدناه ،

private void sum(String newNumber) {
    // BigInteger is immutable, reassign the variable:
    sum = sum.add(new BigInteger(newNumber));
}

بدلاً من استخدام valueOf(long) و valueOf(long) parse() ، يمكنك مباشرة استخدام منشئ BigInteger الذي يأخذ وسيطة سلسلة:

BigInteger numBig = new BigInteger("8599825996872482982482982252524684268426846846846846849848418418414141841841984219848941984218942894298421984286289228927948728929829");

يجب أن يعطيك القيمة المطلوبة.


إليك كيفية القيام بذلك باستخدام JDK فقط باستخدام المخازن المؤقتة لصفيف البايت. هذا هو في الواقع كيف IOUtils.copy()تعمل جميع أساليب commons-io . يمكنك استبدال byte[]مع char[]إذا كنت تنسخ من Readerبدلا من InputStream.

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

...

InputStream is = ....
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
byte[] buffer = new byte[8192];
int count = 0;
try {
  while ((count = is.read(buffer)) != -1) {
    baos.write(buffer, 0, count);
  }
}
finally {
  try {
    is.close();
  }
  catch (Exception ignore) {
  }
}

String charset = "UTF-8";
String inputStreamAsString = baos.toString(charset);






java string biginteger