(Java) Почему Integer .Функция toOctalString() иногда работает правильно, а иногда нет? (подробности см. в моей программе)

#java #function

#java #функция

Вопрос:

В настоящее время я работаю над программой о добавлении восьмеричных чисел, и мне нужно использовать целое число.Функция toOctalString() для изменения десятичной дроби на восьмеричную следующим образом: Integer .toOctalString(5 3), которая вернет правильный ответ «10», но для этого одного целого числа.toOctalString(221 2) возвращает не 223, а странный 337? Как я могу это исправить, и вот моя программа. Вот картинка для вопроса, ее трудно объяснить, так что вот онавведите описание изображения здесь, Спасибо

 package first_try;
import java.io.IOException;
import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class main {
    public static void main(String[] args) throws IOException {
    int s, d, r;
    Scanner k = new Scanner(System.in);
    ArrayList<Integer> data1 = new ArrayList<>(3);
    ArrayList<Integer> data2 = new ArrayList<>(3);
    ArrayList<Integer> data3 = new ArrayList<>(3);
    ArrayList<Integer> data4 = new ArrayList<>(3);
    ArrayList<Integer> data5 = new ArrayList<>(3);

    for(int i = 0; i < 3; i  )
        data1.add(k.nextInt());
    for(int i = 0; i < 3; i  )
        data2.add(k.nextInt());
    for(int i = 0; i < 3; i  )
        data3.add(k.nextInt());
    for(int i = 0; i < 3; i  )
        data4.add(k.nextInt());
    for(int i = 0; i < 3; i  )
        data5.add(k.nextInt());

    ArrayList<Integer> result = new ArrayList<>(5);
    result.add(Calculation(data1.get(0),data1.get(1),data1.get(2)));
    result.add(Calculation(data2.get(0),data2.get(1),data2.get(2)));
    result.add(Calculation(data3.get(0),data3.get(1),data3.get(2)));
    result.add(Calculation(data4.get(0),data4.get(1),data4.get(2)));
    result.add(Calculation(data5.get(0),data5.get(1),data5.get(2)));
    System.out.println(result);


}

public static int Calculation(int s, int d, int r)
{


    int num = r*(1 r)/2;
    ArrayList<String> output = new ArrayList<String>(num);
    ArrayList<Integer> answer = new ArrayList<Integer>();
    int sum = 0;
    int number = 0;
    for(int i = 0; i < num-1; i  )
    {
        output.add(Integer.toOctalString(s d));
        s  = d;
    }

    for(int j = 0; j < r; j  )
    {
        number = Integer.parseInt(output.get((output.size()-1) - j));

        while (number > 0) {
            answer.add(number%10);
            number = number / 10;
        }

    }


    for(int key : answer)
        sum  = key;

    return sum;

}
  

}

тестовые данные, которые я использую сейчас, это

 SAMPLE INPUT:    SAMPLE OUTPUT:
2 3 5            1. 36
221 2 4          2. 38
1 4 20           3. 230
10 10 10         4. 99
3245 5 11        5. 178
  

но результат, который я получил, таков

 36
48 
230 
115
208
  

Комментарии:

1. 223 в восьмеричном действительно 337. Что не так?

2. Если входные данные должны быть в восьмеричном формате, вам нужно их прочитать k.nextInt(8) .

3. 221 уже восьмеричное число, что означает 221 2

4. Нет, «221» НЕ ЯВЛЯЕТСЯ «уже восьмеричным»! В коде Java (то, что Abra называет «целочисленными литералами»); 221 : является десятичным «221»; 0335 : восьмеричным, 0xdd : шестнадцатеричным. Если вы хотите ввести восьмеричное (основание 8) целое число с помощью Scanner, тогда используйте scanner.nextInt(8) , как предложил Кевин Андерсон. Или введите 0221 (десятичное число «145»). И, ПОЖАЛУЙСТА , выберите более значимое имя переменной, чем «k», для вашего объекта сканера.

Ответ №1:

Спецификации Java SE содержат ссылки на все версии спецификации языка Java

Обратитесь к разделу о целочисленных литералах, например, в версии Java 8.

221 — десятичный целочисленный литерал, а 0_221 — восьмеричный литерал. Следовательно, ваш java-код интерпретирует 221 как десятичное, а не восьмеричное число.