плохой результат моего кода

avatar
user8076811
8 апреля 2018 в 09:01
51
3
0

Кажется, у меня возникла проблема, и ожидаемый вывод:

9000 + 200 + 50 + 6

Но я получаю:

90000 + 2000 + 500 + 60

Вот мой код:

class Kata
{
    public static String expandedForm(int num) {
        String s =  String.valueOf(num);
        StringBuilder result = new StringBuilder();

        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '0') continue;
            result.append(s.charAt(i) + makesZero(s.length() - i));
            if(i != s.length() - 1) result.append(" + ");
        }
        return result.toString();
    }

    public static String makesZero(int num) {
        StringBuilder result = new StringBuilder();
        for(int i = 0; i < num; i++)
            result.append("0");
        return result.toString();
    }
}

public class Main {
    public static void main(String args[]) {
        System.out.println(Kata.expandedForm(9256));
    }
}
Источник
Swift - Friday Pie
8 апреля 2018 в 09:09
0

отладка или рисование (и последующие) блок-схемы могут исправить это! это типичная проблема +1/-1

Ответы (3)

avatar
Adrian Lawson
8 апреля 2018 в 10:23
0

Вы имеете дело с классической ошибкой "не на единицу". Это легко решить, но большая проблема с вашим подходом заключается в том, что вы решаете проблему неестественным способом, что затрудняет понимание и отладку вашего кода. Определение количества добавляемых нулей по своей сути является математической задачей, но вы рассматриваете ее как задачу со строками, что снижает выразительность вашего кода.

Вот предлагаемая переработка вашего метода expandedForm, который решает эту проблему по-другому.

public static String expandedForm(int num) {
    if (num == 0)
        return "0";

    int zeroes = (int) Math.log10(num);
    StringBuilder result = new StringBuilder();

    while (zeroes >= 0) {
        int multiple = (int) Math.pow(10, zeroes);
        int digit = num / multiple;
        result.append(String.valueOf(digit * multiple));

        if (zeroes > 0)
            result.append(" + ");

        num = num % multiple;
        --zeroes;
    }

    return new String(result);
}
avatar
Pshemo
8 апреля 2018 в 09:09
3

В

result.append(s.charAt(i) + makesZero(s.length() - i));

строка, в которую вы добавляете символ в позиции i и length - i нули. Давайте посмотрим, что произойдет для s="9256".

Если i=0

  • s.charAt(i)->s.charAt(0)->'9' (выглядит нормально)
  • makesZero(s.length() - i) -> makesZero(4 - 0)) -> makesZero(4) -> "0000".

Итак, как вы видите, вы добавляете один лишний ноль, потому что вы не учли, что в то время как 9 представляет тысячи, но тысячи, несмотря на наличие 4 цифр, должны иметь 3 нуля. Итак, вам нужно уменьшить один ноль с помощью

makesZero(s.length() - i - 1).


BTW builder.append(foo + bar) (когда + представляет конкатенацию, а не сложение) следует записывать как builder.append(foo).append(bar). В противном случае вы закончите что-то вроде

builder.append(new StringBuilder().append(foo).append(bar).toString())

, что означает, что вам все равно нужно создать отдельный билдер для каждого +.

Мы используем StringBuilder#append именно для того, чтобы избежать + и подобных ненужных объектов.

avatar
Borjante
8 апреля 2018 в 09:06
-2

Просто начните свой цикл с i = 1 и i <= s. длина()

user8076811
8 апреля 2018 в 09:11
0

та же проблема, вы можете скомпилировать, я использую идею Intellij

Borjante
8 апреля 2018 в 09:23
0

Извините, я с телефона. Но это определенно должно решить проблему