Reputation: 3029
I'm trying to read some really big numbers from standard input and add them together.
However, to add to BigInteger, I need to use 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)));
}
That works fine, but as the BigInteger.valueOf()
only takes a long
, I cannot add numbers greater than long
's max value (9223372036854775807).
Whenever I try to add 9223372036854775808 or more, I get a NumberFormatException (which is completely expected).
Is there something like BigInteger.parseBigInteger(String)
?
Upvotes: 100
Views: 255006
Reputation: 42050
Using the constructor
public BigInteger(String val)
Translates the decimal String representation of a BigInteger into a BigInteger.
Upvotes: 166
Reputation: 1
If you may want to convert plaintext (not just numbers) to a BigInteger you will run into an exception, if you just try to: new BigInteger("not a Number")
In this case you could do it like this way:
public BigInteger stringToBigInteger(String string){
byte[] asciiCharacters = string.getBytes(StandardCharsets.US_ASCII);
StringBuilder asciiString = new StringBuilder();
for(byte asciiCharacter:asciiCharacters){
asciiString.append(Byte.toString(asciiCharacter));
}
BigInteger bigInteger = new BigInteger(asciiString.toString());
return bigInteger;
}
Upvotes: 0
Reputation: 589
BigInteger has a constructor where you can pass string as an argument.
try below,
private void sum(String newNumber) {
// BigInteger is immutable, reassign the variable:
this.sum = this.sum.add(new BigInteger(newNumber));
}
Upvotes: 10
Reputation: 21
For a loop where you want to convert an array
of strings
to an array
of bigIntegers
do this:
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
}
Upvotes: 2
Reputation: 101
Instead of using valueOf(long)
and parse()
, you can directly use the BigInteger constructor that takes a string argument:
BigInteger numBig = new BigInteger("8599825996872482982482982252524684268426846846846846849848418418414141841841984219848941984218942894298421984286289228927948728929829");
That should give you the desired value.
Upvotes: 10
Reputation: 14426
According to the documentation:
BigInteger(String val)
Translates the decimal String representation of a BigInteger into a BigInteger.
It means that you can use a String
to initialize a BigInteger
object, as shown in the following snippet:
sum = sum.add(new BigInteger(newNumber));
Upvotes: 30