проблема класса Scanner в java при вводе целой и многострочной строки - PullRequest
1 голос
/ 17 апреля 2020

Я столкнулся с проблемой, когда решил проблему с алгоритмом в java. алгоритм выглядит следующим образом:

Описание проблемы:
Если дано n шестнадцатеричных положительных целых чисел, выведите их восьмеричные числа

Формат ввода:
первое действие ввода - положительное целое число n (1 <= n <= 10) следующие n строк, каждая строка состоит из строки от 0 до 9 в верхнем регистре, буквы A ~ F, представляющие шестнадцатеричные положительные целые числа для преобразования, каждое шестнадцатеричное число длиной не более 100 000 </p>

Формат вывода
Вывести n строк, в каждой строке ввести восьмеричное положительное целое число.

【note】
Введенное вами шестнадцатеричное число не имеет начального 0, например 012A , Выходное восьмеричное число не должно начинаться с 0

Пример ввода:

2
39
123AB C

Пример вывода:

71
4435274

мое решение ниже:

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) throws IOException {
        String[] hexMapping = {
        "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
    };
    Map<String,String> octMapping = new HashMap<>();
    octMapping.put("000","0");
    octMapping.put("001","1");
    octMapping.put("010","2");
    octMapping.put("011","3");
    octMapping.put("100","4");
    octMapping.put("101","5");
    octMapping.put("110","6");
    octMapping.put("111","7");

    String hexString = "";
    StringBuilder hex2Bin = new StringBuilder("");
    StringBuilder bin2Oct = new StringBuilder("");

    Scanner input = new Scanner(System.in);
    int n = input.nextInt();

//  consuming the <enter> from input above
    input.nextLine();

    for (int i = 0; i < n; i++) {
        hexString = input.nextLine();
        // hex to bin
        int hexLen = hexString.length();
        for (int j = 0; j < hexLen; j++) {
            if (hexString.charAt(j)>'9') {
                hex2Bin.append(hexMapping[hexString.charAt(j)-'A'+10]);
            } else {
                hex2Bin.append(hexMapping[hexString.charAt(j)-'0']);
            }
        } //end for

        // add "00" or "0"
        int len = hex2Bin.length();
        if (len % 3 == 1) {
            hex2Bin.insert(0,"00");
        } else if (len % 3 == 2) {
            hex2Bin.insert(0,"0");
        }

        // bin to oct
        int newLen = hex2Bin.length();
        String temp = "";
        for (int j = 0; j < newLen; j+=3 ) {
            temp = octMapping.get(hex2Bin.substring(j,j+3));
            if (temp.equals("0")) {
                continue;
            }
            bin2Oct.append(temp);
        } //end for
        System.out.println(bin2Oct);
    }//end for
    input.close();
}

при вводе:

1
39

или

1
123AB C

оба значения верны.

но при вводе:

2
39
123AB C

Я не могу получить правильный ответ.

Я думаю, что причиной является вход, когда я использую сканер в для l oop, я не знаю, как решить эту проблему, подскажите?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Вы печатаете содержимое bin2Oct в конце вашего l oop, но эта переменная используется повторно на всех итерациях.

Вам необходимо объявить эти переменные внутри вашего l oop поэтому они воссоздаются каждый раз. Другими словами, переместите следующий блок:

StringBuilder hex2Bin = new StringBuilder("");
StringBuilder bin2Oct = new StringBuilder("");

на ваш l oop (после строки с for (...)).

0 голосов
/ 17 апреля 2020

вам просто нужно инициализировать два StringBuilder в каждом тестовом примере в for l oop, при первой попытке он всегда будет работать, потому что он пустой, но при последующих попытках вы продолжите работать со старым значения, и это даст вам неправильный ответ.

Другое замечание, но оно не влияет на окончательный ответ. Если вы используете сканер, вы можете прочитать значение String, используя input.next(), поэтому вам не нужно использовать nextLine, что может привести к путанице Вы, если вы используете nextInt()

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) throws IOException {
        String[] hexMapping = {
        "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"
    };
    Map<String,String> octMapping = new HashMap<>();
    octMapping.put("000","0");
    octMapping.put("001","1");
    octMapping.put("010","2");
    octMapping.put("011","3");
    octMapping.put("100","4");
    octMapping.put("101","5");
    octMapping.put("110","6");
    octMapping.put("111","7");

    String hexString = "";


    Scanner input = new Scanner(System.in);
    int n = input.nextInt();



    for (int i = 0; i < n; i++) {
        hexString = input.next();
        // hex to bin
        int hexLen = hexString.length();
        StringBuilder hex2Bin = new StringBuilder("");
        StringBuilder bin2Oct = new StringBuilder("");
        for (int j = 0; j < hexLen; j++) {
            if (hexString.charAt(j)>'9') {
                hex2Bin.append(hexMapping[hexString.charAt(j)-'A'+10]);
            } else {
                hex2Bin.append(hexMapping[hexString.charAt(j)-'0']);
            }
        } //end for

        // add "00" or "0"
        int len = hex2Bin.length();
        if (len % 3 == 1) {
            hex2Bin.insert(0,"00");
        } else if (len % 3 == 2) {
            hex2Bin.insert(0,"0");
        }

        // bin to oct
        int newLen = hex2Bin.length();
        String temp = "";
        for (int j = 0; j < newLen; j+=3 ) {
            temp = octMapping.get(hex2Bin.substring(j,j+3));
            if (temp.equals("0")) {
                continue;
            }
            bin2Oct.append(temp);
        } //end for
        System.out.println(bin2Oct);
    }//end for
    input.close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...