【问题标题】:Program for addition and substraction with strings字符串加减法程序
【发布时间】:2018-10-22 19:53:34
【问题描述】:

我编写了一个程序,我想对字符串进行加减运算,其中所有字符串的长度都是四,看起来像“+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;
    }

【问题讨论】:

  • 你可以用两行代码把字符串转换成数字,然后用它们计算。还是有什么原因,你为什么用字符串计算?
  • 我不允许使用从 String 到 int 的类型转换方法。
  • 您是否允许仅使用循环和 charAt 自行转换它?像这样:digit0 + digit1 * 10 + ...(你甚至不需要循环)
  • 如果我使用加法定义的乘法方法,那么是的。

标签: java string char int charat


【解决方案1】:

由于允许使用 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;

那么你就可以用这个数字来计算了。

【讨论】:

  • 用加法定义的乘法方法是的。我也尝试过这种方式,但不知何故,我的输出中的零太多了。
  • 将问题拆分为子问题,单独解决子问题,然后组合解决方案以获得原始问题的解决方案总是好的。所以我建议,你单独实现以下函数:乘法、除法、StringToInt、IntToString。然后结合这些功能来解决你的问题。这样一来,您的代码就更容易理解,也更容易发现错误。
【解决方案2】:

这行得通吗?

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();
}

【讨论】:

    【解决方案3】:

    您提到某些情况不起作用,但您不确定原因。我认为这与您的 if 语句有关。

    例如第一个循环中的第一个 if:

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

    如果紧随其后,将在与 else 完全相同的情况下评估 true:

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

    (因为在第一种情况下,您首先评估任一值是否为零,然后反转结果)。

    然后是第一个循环中的第一个嵌套if:

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

    在我看来,这将始终评估为 true,因为您只是从两个字符串中提取一个字符。所以加法可能的最高结果是 18。从中减去 96,它一定会小于 10。

    为了调试它并找到问题,我建议您首先仔细检查所有 if 语句。用 cmets 写下来,甚至做一个图表来确定何时应该达到某个步骤以及在那里应该发生什么。此外,如果您尚未使用可能会有所帮助的 IDE,因为它会提醒您注意逻辑中的一些问题。

    【讨论】:

    • 欢迎来到 SO。访问stackoverflow.com/editing-help 了解如何格式化您的答案。
    • 是的,我已经注意到了这个错误,但这并不能解决我的问题。
    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2010-09-12
    相关资源
    最近更新 更多