This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
// SumBigIntegerOctal.java
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
public class SumBigIntegerOctal {
|
||||
|
||||
public static void main(String[] args) {
|
||||
BigInteger sum = new BigInteger("0");
|
||||
for (String argument : args) {
|
||||
StringBuilder number = new StringBuilder();
|
||||
for (char c : argument.toCharArray()) {
|
||||
if (!Character.isWhitespace(c)) {
|
||||
number.append(c);
|
||||
} else {
|
||||
sum = sum.add(parseNumber(number));
|
||||
number = new StringBuilder();
|
||||
}
|
||||
}
|
||||
|
||||
sum = sum.add(parseNumber(number));
|
||||
}
|
||||
|
||||
System.out.println(sum);
|
||||
}
|
||||
|
||||
static BigInteger parseNumber(StringBuilder number) {
|
||||
if (!number.isEmpty()) {
|
||||
String numberString = number.toString();
|
||||
int numberStringLength = numberString.length();
|
||||
if (numberString.endsWith("o") || numberString.endsWith("O")) {
|
||||
return new BigInteger(
|
||||
number.substring(0, numberStringLength - 1),
|
||||
8
|
||||
);
|
||||
} else {
|
||||
return new BigInteger(numberString);
|
||||
}
|
||||
} else {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,228 @@
|
||||
---
|
||||
title: SumBigIntegerOctal
|
||||
weight: 6
|
||||
---
|
||||
|
||||
# Task
|
||||
|
||||
- Input data fits into [`BigInteger`](https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html) data type.
|
||||
- Octal numbers ends with `o`.
|
||||
- Class should be named `SumBigIntegerOctal`.
|
||||
|
||||
## Solution
|
||||
|
||||
Let's change our `parseNumber` method code from `SumLongOctal` modification. Here's what it looked like
|
||||
|
||||
```java
|
||||
static long parseNumber(StringBuilder number) {
|
||||
if (!number.isEmpty()) {
|
||||
String numberString = number.toString();
|
||||
int numberStringLength = numberString.length();
|
||||
if (numberString.endsWith("o") || numberString.endsWith("O")) {
|
||||
return new BigInteger(
|
||||
number.substring(0, numberStringLength - 1),
|
||||
8
|
||||
).longValue();
|
||||
} else {
|
||||
return Long.parseLong(numberString);
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
First of all let's change the output type of our method to `BigInteger`.
|
||||
|
||||
```java
|
||||
static BigInteger parseNumber(StringBuilder number) {...}
|
||||
```
|
||||
|
||||
Also in case of an empty number we can't just `return 0` anymore because it doesn't have `BigInteger` data type. Instead we are going to return [`BigInteger.ZERO`](https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#ZERO).
|
||||
|
||||
Here we can get rid of `.longValue()` because we just need straight `BigInteger` type.
|
||||
|
||||
```java
|
||||
return new BigInteger(number.substring(0, numberStringLength - 1), 8); // .longValue();
|
||||
```
|
||||
|
||||
Also we change this
|
||||
|
||||
```java
|
||||
return Long.parseLong(numberString);
|
||||
```
|
||||
|
||||
to this
|
||||
|
||||
```java
|
||||
return new BigInteger(numberString);
|
||||
```
|
||||
|
||||
for the same reason. So the `parseNumber` will look like this
|
||||
|
||||
```java
|
||||
static BigInteger parseNumber(StringBuilder number) {
|
||||
if (!number.isEmpty()) {
|
||||
String numberString = number.toString();
|
||||
int numberStringLength = numberString.length();
|
||||
if (numberString.endsWith("o") || numberString.endsWith("O")) {
|
||||
return new BigInteger(
|
||||
number.substring(0, numberStringLength - 1),
|
||||
8
|
||||
);
|
||||
} else {
|
||||
return new BigInteger(numberString);
|
||||
}
|
||||
} else {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Let's rework our `main` method as well. Here's what it looks like now
|
||||
|
||||
```java
|
||||
public static void main(String[] args) {
|
||||
int sum = 0;
|
||||
for (String argument : args) {
|
||||
StringBuilder number = new StringBuilder();
|
||||
for (char c : argument.toCharArray()) {
|
||||
if (!Character.isWhitespace(c)) {
|
||||
number.append(c);
|
||||
} else {
|
||||
sum += parseNumber(number);
|
||||
number = new StringBuilder();
|
||||
}
|
||||
}
|
||||
|
||||
sum += parseNumber(number);
|
||||
}
|
||||
|
||||
System.out.println(sum);
|
||||
}
|
||||
```
|
||||
|
||||
First of all, let's change the data type of `sum` to `BigInteger` like this
|
||||
|
||||
```java
|
||||
BigInteger sum = new BigInteger("0");
|
||||
```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Notice, we can't just do `new BigInteger()` (without any arguments) like we did with `StringBuilder`. We need to put the initial value as an argument like [`new BigInteger(String val)`](https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#BigInteger-java.lang.String-).
|
||||
|
||||
So in this stage our code will look like this
|
||||
|
||||
```java
|
||||
// SumBigIntegerOctal.java
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
public class SumBigIntegerOctal {
|
||||
|
||||
public static void main(String[] args) {
|
||||
BigInteger sum = new BigInteger("0");
|
||||
for (String argument : args) {
|
||||
StringBuilder number = new StringBuilder();
|
||||
for (char c : argument.toCharArray()) {
|
||||
if (!Character.isWhitespace(c)) {
|
||||
number.append(c);
|
||||
} else {
|
||||
sum += parseNumber(number);
|
||||
number = new StringBuilder();
|
||||
}
|
||||
}
|
||||
|
||||
sum += parseNumber(number);
|
||||
}
|
||||
|
||||
System.out.println(sum);
|
||||
}
|
||||
|
||||
static BigInteger parseNumber(StringBuilder number) {
|
||||
if (!number.isEmpty()) {
|
||||
String numberString = number.toString();
|
||||
int numberStringLength = numberString.length();
|
||||
if (numberString.endsWith("o") || numberString.endsWith("O")) {
|
||||
return new BigInteger(
|
||||
number.substring(0, numberStringLength - 1),
|
||||
8
|
||||
);
|
||||
} else {
|
||||
return new BigInteger(numberString);
|
||||
}
|
||||
} else {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
And let's try to compile this
|
||||
|
||||
```bash
|
||||
$ javac SumBigIntegerOctal.java
|
||||
SumBigIntegerOctal.java:15: error: bad operand types for binary operator '+'
|
||||
sum += parseNumber(number);
|
||||
^
|
||||
first type: BigInteger
|
||||
second type: BigInteger
|
||||
SumBigIntegerOctal.java:20: error: bad operand types for binary operator '+'
|
||||
sum += parseNumber(number);
|
||||
^
|
||||
first type: BigInteger
|
||||
second type: BigInteger
|
||||
2 errors
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> We can't use `+` operand with `BigInteger` data type. Instead we need to use [`BigInteger.add(BigInteger val)`](https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#add-java.math.BigInteger-).
|
||||
|
||||
So we will modify like so
|
||||
|
||||
```java
|
||||
// SumBigIntegerOctal.java
|
||||
|
||||
import java.math.BigInteger;
|
||||
|
||||
public class SumBigIntegerOctal {
|
||||
|
||||
public static void main(String[] args) {
|
||||
BigInteger sum = new BigInteger("0");
|
||||
for (String argument : args) {
|
||||
StringBuilder number = new StringBuilder();
|
||||
for (char c : argument.toCharArray()) {
|
||||
if (!Character.isWhitespace(c)) {
|
||||
number.append(c);
|
||||
} else {
|
||||
sum = sum.add(parseNumber(number));
|
||||
number = new StringBuilder();
|
||||
}
|
||||
}
|
||||
|
||||
sum = sum.add(parseNumber(number));
|
||||
}
|
||||
|
||||
System.out.println(sum);
|
||||
}
|
||||
|
||||
static BigInteger parseNumber(StringBuilder number) {
|
||||
if (!number.isEmpty()) {
|
||||
String numberString = number.toString();
|
||||
int numberStringLength = numberString.length();
|
||||
if (numberString.endsWith("o") || numberString.endsWith("O")) {
|
||||
return new BigInteger(
|
||||
number.substring(0, numberStringLength - 1),
|
||||
8
|
||||
);
|
||||
} else {
|
||||
return new BigInteger(numberString);
|
||||
}
|
||||
} else {
|
||||
return BigInteger.ZERO;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
And this code will pass all the tests!
|
||||
Reference in New Issue
Block a user