Программа для сложения и вычитания со строками - PullRequest
0 голосов
/ 22 октября 2018

Я написал программу, в которой я хочу сделать сложение и вычитание строк, где все строки имеют длину четыре и выглядят как «+002», «+569», «-022», «-789»и т.д. Я пытался сделать это без использования умножения, деления или остатка, но только с добавлением и вычитанием в качестве операций, но моя проблема в том, что некоторые случаи еще не работают, и я не понимаю, почему именно или как яЯ могу исправить это, потому что с таким длинным кодом трудно понять, где именно проблема, и что я должен изменить.Итак, вот соответствующий метод:

public static String add(String s1, String s2) {
        int number;
        int[] s = new int[4];
        String result = "";
        if (s1.contains("+") && s2.contains("+")) {
            result = "+";
            for (int i = 1; i < s1.length(); ++i) {
                if (!(s1.charAt(i) == 0 || s2.charAt(i) == 0)) {
                    if ((int) (s1.charAt(i)) + (int) (s2.charAt(i)) - 96 < 10) s[i] = (int) (s1.charAt(i)) + (int) (s2.charAt(i)) - 96;
                    else {
                        s[i] = (s1.charAt(i)) + (int) (s2.charAt(i)) - 106;
                    ++s[i - 1];
                    }
                }
                else if (s1.charAt(i) != 0 && s2.charAt(i) != 0) {
                    s[i] = (int) (s1.charAt(i)) + (int) (s2.charAt(i)) - 96;
                }
            }
        }
        else if (s1.contains("-") && s1.contains("-")) {
            result = "-";
            for (int i = 1; i < s1.length(); ++i) {
                if ((!(s1.charAt(i) == 0 || s2.charAt(i) == 0))) {
                    if ((int) (s1.charAt(i)) + (int) (s2.charAt(i)) - 96 < 10) s[i] = (int) (s1.charAt(i)) + (int) (s2.charAt(i)) - 96;
                    else {
                        s[i] = (s1.charAt(i)) + (int) (s2.charAt(i)) - 106;
                    ++s[i - 1];
                    }
                }
                else if (s1.charAt(i) != 0 && s2.charAt(i) != 0) {
                    s[i] = (int) (s1.charAt(i)) + (int) (s2.charAt(i)) - 96;
                }
            }
        }
        //if (s1.contains("+") && s1.contains("-") || s1.contains("-") && s1.contains("+"))
        else if (s1.contains("+") && s2.contains("-")) {
            char[] size1 = new char[s1.length()];
            char[] size2 = new char[s1.length()];
            for (int i = 1; i < s1.length(); ++i) {
                size1[i] = s1.charAt(i); 
                size2[i] = s2.charAt(i); 
            }
            if (size1[1] > size2[1]) result = "+";
            else if (size1[1] == size2[1]) {
                if (size1[2] > size2[2]) result = "+";
                else if (size1[2] == size2[2]) {
                    if (size1[3] > size2[3]) result = "+";
                    else if (size1[3] == size2[3]) return "+000";
                    else result = "-";
                }
                else result = "-";
            }
            else result = "-";
            for (int i = 1; i < s1.length(); ++i) {
                if (!(s1.charAt(i) == 0 || s2.charAt(i) == 0)) {
                    if (s1.charAt(1) < s2.charAt(1)) {
                        if (s1.charAt(2) <= s2.charAt(2)) {
                            if (s1.charAt(3) > s2.charAt(3)) {
                                s[2] = 10 - (s2.charAt(2) - s1.charAt(2));
                                s[3] = 10 - (s1.charAt(3) - s2.charAt(3));
                                --s[2];
                                s[1] = (s2.charAt(1) - s1.charAt(1));
                            }
                            else {
                                s[2] = (s2.charAt(2) - s1.charAt(2));
                                s[3] = (s2.charAt(3) - s1.charAt(3));
                                s[1] = s2.charAt(1) - s1.charAt(1);
                            }
                        }
                        else {
                            s[2] = 10 - (s1.charAt(2) - s2.charAt(2));
                            if (s1.charAt(3) < s2.charAt(3)) s[3] = (s2.charAt(3) - s1.charAt(3));
                            else {
                                s[3] = 10 - (s1.charAt(3) - s2.charAt(3));
                                --s[2];
                            }
                        }
                    }
                    else if (s1.charAt(i) - s2.charAt(i) < 0 && i == 1) s[i] = s2.charAt(i) - s1.charAt(i);
                    else if (s1.charAt(i) - s2.charAt(i) < 0 && i > 1) {
                        s[i] = s2.charAt(i) - s1.charAt(i);
                    }
                    else s[i] = s1.charAt(i) - s2.charAt(i);
                }
            }
        }
        else {
            char[] size1 = new char[s1.length()];
            char[] size2 = new char[s1.length()];
            for (int i = 1; i < s1.length(); ++i) {
                size1[i] = s1.charAt(i); 
                size2[i] = s2.charAt(i); 
            }
            if (size1[1] < size2[1]) result = "+";
            else if (size1[1] == size2[1]) {
                if (size1[2] < size2[2]) result = "+";
                else if (size1[2] == size2[2]) {
                    if (size1[3] < size2[3]) result = "+";
                    else if (size1[3] == size2[3]) return "+000";
                    else result = "-";
                }
                else result = "-";
            }
            else result = "-";
            for (int i = 1; i < s1.length(); ++i) {
                if (!(s1.charAt(i) == 0 || s2.charAt(i) == 0)) {
                    if (s1.charAt(1) > s2.charAt(1)) {
                        if (s1.charAt(2) >= s2.charAt(2)) {
                            if (s1.charAt(3) < s2.charAt(3)) {
                                s[2] = 10 - (s1.charAt(2) - s2.charAt(2));
                                s[3] = 10 - (s2.charAt(3) - s1.charAt(3));
                                --s[2];
                            }
                            else {
                                s[2] = (s1.charAt(2) - s2.charAt(2));
                                s[3] = (s1.charAt(3) - s2.charAt(3));
                                s[1] = s1.charAt(1) - s2.charAt(1);
                            }
                        }
                    }
                    else if (s1.charAt(i) - s2.charAt(i) > 0 && i == 1) s[i] = s1.charAt(i) - s2.charAt(i);
                    else if (s1.charAt(i) - s2.charAt(i) > 0 && i > 1) {
                        s[i] = s1.charAt(i) - s2.charAt(i);
                    }
                    else s[i] = s2.charAt(i) - s1.charAt(i);
                }
            }
        }
        for (int i = 1; i < s.length; ++i) result += s[i];
        return result;
    }

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Будет ли это работать?

private static String add(String s1, String s2) {
    return intToString(stringToInt(s1) + stringToInt(s2));
}

private static int stringToInt(String string) {
    int multiplicand;
    int i = 0;

    multiplicand = string.charAt(0) == '+' ? 1 : -1;

    i += (string.charAt(1) - '0') * 100;
    i += (string.charAt(2) - '0') * 10;
    i += (string.charAt(3) - '0');

    return i * multiplicand;
}

private static String intToString(int i) {
    StringBuilder sb = new StringBuilder();

    sb.append(i >= 0 ? "+" : "-");

    i = Math.abs(i);

    sb.append(i / 100);
    sb.append(i / 10 - (i / 100 * 10));
    sb.append(i - (i / 10 * 10));

    return sb.toString();
}
0 голосов
/ 22 октября 2018

Вы упоминаете, что некоторые случаи не работают, и вы не знаете, почему.Я думаю, что это связано с вашими if-утверждениями.

Например, первый, если в первом цикле:

 if (!(s1.charAt(i) == 0 || s2.charAt(i) == 0)) {...}

будет оценивать значение true в тех же самых случаях, что и остальные, если за ним следует:

else if (s1.charAt(i) != 0 && s2.charAt(i) != 0) {...}

(Потому что в первом случае вы сначала оцениваете, равно ли какое-либо значение нулю, а затем инвертируете результат).

А затем первый вложенный элемент в первом цикле:

if ((int) (s1.charAt(i)) + (int) (s2.charAt(i)) - 96 < 10) {...}

Мне кажетсяэто всегда будет иметь значение true, потому что вы берете один символ из обеих строк.Таким образом, наивысший возможный результат от добавления - 18. Вычтите 96 из этого, и оно должно быть меньше 10.

Чтобы отладить это и найти проблему, я бы рекомендовал начать с двойной проверки всехоператоры if.Запишите в комментариях или даже сделайте диаграмму, чтобы определить, когда должен быть достигнут определенный шаг и что должно произойти там.Кроме того, если вы еще не используете интегрированную среду разработки, которая может помочь, поскольку она предупредит вас о некоторых проблемах в логике.

0 голосов
/ 22 октября 2018

Поскольку вам разрешено использовать charAt (), вы можете конвертировать строки самостоятельно:

// String s1 = "+123";
int d1 = (s1.charAt(1) - '0') * 100;
int d2 = (s1.charAt(2) - '0') * 10;
int d3 = (s1.charAt(3) - '0');
int num = d1 + d2 + d3;

Тогда вы можете просто рассчитать с этим числом.

...