Каким будет восьмеричный контрольный пример, который провалит следующую программу? - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь написать программу, которая принимает неотрицательное восьмеричное число с максимальным значением от 8 до 200000.На входе не будет никаких начальных нулей, а на выходе не должно быть никаких дополнительных начальных нулей.Я не могу представить себе контрольный пример, который бы провалился, но, конечно, это не правильный ответ.Следовательно, я пропускаю крайний случай, интересно, какой.Мне известно, что во время этого преобразования могут возникать некоторые проблемы с «ведущими нулями», но я не до конца понимаю, к чему это приводит, поэтому не могу увидеть проблему / найти решение для нее.

import java.util.*;
import java.io.*;

public class arithmetic{
    public static void main(String[] args) throws Exception{
        InputStreamReader ir = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(ir);
        String octal = br.readLine();
        if(octal == null){
            System.out.println("0");
            return;
        }

        long decimal = Long.parseLong(octal,8);
        System.out.println(Long.toHexString(decimal).toUpperCase());

    }
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

На этот вопрос в основном уже дан ответ, но есть одна вещь, которую необходимо добавить.

Я знаю, что есть некоторые проблемы с "ведущими нулями", с которыми можно столкнуться во время этого преобразования.

С этим проблем не будет.Ведущие нули имеют отношение только к литералам Java в исходном коде.(Где ведущий ноль означает «восьмеричное» ...)


Кстати, вы могли бы преобразовать большое восьмеричное число (представленное в виде символов) в шестнадцатеричное, и наоборот, без преобразованиядо BigInteger или BigDecimal (или эквивалент).Но вам нужно либо начинать с наименее значимого (крайнего правого) конца числовой строки, либо вам нужно знать, сколько символов в числовой строке.

0 голосов
/ 10 июня 2018

Попробуйте восьмеричное число с большим и большим количеством цифр.Ваш ввод может содержать до 2000000. A Java Long - это только 64-разрядное число со знаком .

Вы не можете поместить достаточно большое восьмеричное число в любой базовый тип Java, поэтомувам нужен совершенно другой подход.

Один из способов - прочитать группы из 8 восьмеричных цифр (24 бита) и преобразовать их в группы из 6 шестнадцатеричных цифр.

Или посмотрите этот ответ , чтобы узнать больше о BigInteger и BigDecimal.

...