整数四则运算, 无括号, 求验证所写程序是否正确 5C
package test;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        // 非负整数 小于10000
        // 2+3*4-2+5+3*2-100
        String line;
        String right;
        String left;
        String middle;
        String sign1;
        String sign2;

        line = in.nextLine();
        int lineLength = line.length();

        if (lineLength > 0) {
            do {

                // 获取最右边的加减号
                int addIndex = line.lastIndexOf("+");
                int subIndex = line.lastIndexOf("-");
                int mulIndex = line.lastIndexOf("*");
                int divIndex = line.lastIndexOf("/");

                // 加减乘除 不存在,
                // 或者只有最前面的负号, 则终止循环, 输出结果
                if (addIndex == -1 && mulIndex == -1 && divIndex == -1) { // end start
                    if (subIndex == -1) {
                        break;
                    } else if (subIndex != -1) {
                        int subSecondIndex = line.lastIndexOf("-", subIndex - 1);
                        if (subIndex == 0 && subSecondIndex == -1) {
                            break;
                        }
                    }
                } // end end

                if (addIndex == -1 && subIndex == -1) { // 加减 无
                    if (divIndex == -1 && mulIndex == -1) { // 加减 乘除 无
                        System.out.println(line);
                    } else { // 乘除 只有
                        line = getMulDivResult(line);
                    }
                } else { // 加减 有
                    // 以最右边的加减号为断点, 开始截取字符串
                    int asIndex = getMaxIndex(addIndex, subIndex);

                    if (divIndex == -1 && mulIndex == -1) { // 加减 只有
                        line = getAddSubResult(line);
                    } else { // 加减乘除 都有
                        // 从最后一个加减号截取来的字符串
                        String str2 = line.substring(asIndex + 1);

                        middle = String.valueOf(line.charAt(asIndex));
                        left = line.substring(0, asIndex);
                        int mdIndex = getMaxIndex(mulIndex, divIndex);

                        right = str2;
                        if (mdIndex > asIndex) { // 在最后一个加减号的后面还存在乘除
                            right = getMulDivResult(str2);
                            line = left + middle + right;
                        } else if (mdIndex < asIndex) { // 在最后一个加减号的后面, 只是单个数字
                            // 查找最后一个加减号之前, 即紧挨着的加减号, 截取其中的乘除字符串

                            int add2Index = line.lastIndexOf("+", asIndex - 1);
                            int sub2Index = line.lastIndexOf("-", asIndex - 1);
                            // 在最后一个加减号, 左边全是乘除, 右边随意
                            if (add2Index == -1 && sub2Index == -1) {
                                left = line.substring(0, asIndex);
                                left = getMulDivResult(left);
                                right = line.substring(asIndex + 1);
                                middle = String.valueOf(line.charAt(asIndex));
                                line = left + middle + right;
                            } else { // 有加减 有乘除
                                int leftIndex = getMaxIndex(line.lastIndexOf("+", mdIndex - 1),
                                        line.lastIndexOf("-", mdIndex - 1));
                                int rightIndex = getMinIndex(line.indexOf("+", mdIndex + 1),
                                        line.indexOf("-", mdIndex + 1));
                                if (leftIndex != -1) {
                                    sign1 = String.valueOf(line.charAt(leftIndex));
                                    left = line.substring(0, leftIndex);
                                } else {
                                    sign1 = "";
                                    left = "";
                                }
                                if (rightIndex != -1) {
                                    sign2 = String.valueOf(line.charAt(rightIndex));
                                } else {
                                    sign2 = "";
                                }

                                middle = line.substring(leftIndex + 1, rightIndex);
                                middle = getMulDivResult(middle);
                                right = line.substring(rightIndex + 1);

                                line = left + sign1 + middle + sign2 + right;

                            }

                        }

                    }
                }
            } while (line.indexOf("+") != -1 || line.indexOf("-") != -1 || line.indexOf("*") != -1
                    || line.indexOf("/") != -1);
            System.out.println(line);
        } // end if

        in.close();

        // 提示:一种可能的做法是,将整个式子作为字符串读入,
        // 然后找出其中最后一个+或-,在此位置将其截成两段,
        // 分别计算后再做+或-,以此类推。
        // 另,用Integer.parseInt(s)可以从一个字符串得到整数。
    }

    /**
     * 单纯乘除计算
     * 
     * @param line
     * @return
     */
    public static String getMulDivResult(String line) {
        String retStr = null;

        String leftStr = null;
        String endStr = null;

        do {
            if (endStr != null) {
                line = leftStr + endStr;
            }
            int index = getMinIndex(line.indexOf("*"), line.indexOf("/"));
            String sign = String.valueOf(line.charAt(index));
            leftStr = line.substring(0, index);
            int index2 = getMinIndex(line.indexOf("*", index + 1), line.indexOf("/", index + 1));
            String rightStr = null;
            if (index2 != -1) {
                rightStr = line.substring(index + 1, index2);
                endStr = line.substring(index2);
            } else if (index2 == -1) {
                rightStr = line.substring(index + 1);
                endStr = line.substring(index + rightStr.length() + 1);
            }

            switch (sign) {
            case "*":
                leftStr = String.valueOf(Integer.parseInt(leftStr) * Integer.parseInt(rightStr));
                break;
            case "/":
                leftStr = String.valueOf(Integer.parseInt(leftStr) / Integer.parseInt(rightStr));
                break;
            }
            retStr = leftStr + endStr;

        } while (endStr.length() > 1);

        return retStr;
    }

    /**
     * 单纯加减计算
     * 
     * @param line
     *            10-4+5
     * @return
     */
    public static String getAddSubResult(String line) {
        String retStr = null;

        String leftStr = null;
        String endStr = null;

        do {
            if (endStr != null) {
                line = leftStr + endStr;
            }
            int index = getMinIndex(line.indexOf("+"), line.indexOf("-"));
            if (index == 0) {
                index = getMinIndex(line.indexOf("+", index + 1), line.indexOf("-", index + 1));
            }
            String sign = String.valueOf(line.charAt(index));
            leftStr = line.substring(0, index);

            int index2 = getMinIndex(line.indexOf("+", index + 1), line.indexOf("-", index + 1));
            String rightStr = null;
            if (index2 != -1) {
                rightStr = line.substring(index + 1, index2);
                endStr = line.substring(index2);
            } else if (index2 == -1) {
                rightStr = line.substring(index + 1);
                endStr = line.substring(index + rightStr.length() + 1);
            }

            switch (sign) {
            case "+":
                leftStr = String.valueOf(Integer.parseInt(leftStr) + Integer.parseInt(rightStr));
                break;
            case "-":
                leftStr = String.valueOf(Integer.parseInt(leftStr) - Integer.parseInt(rightStr));
                break;
            }
            retStr = leftStr + endStr;

        } while (endStr.length() > 1);

        return retStr;
    }

    /**
     * 获取非-1, 较大数字的下标
     * 
     * @param index1
     * @param index2
     * @return
     */
    public static int getMaxIndex(int index1, int index2) {
        int max = -1; // 提前假设两者都是-1
        if (index1 > index2) {
            max = index1;
        }
        if (index1 < index2) {
            max = index2;
        }
        return max;
    }

    /**
     * 获取非-1, 较小数字的下标
     * 
     * @param index1
     * @param index2
     * @return
     */
    public static int getMinIndex(int index1, int index2) {
        int ret = 1;
        if (index1 == -1) {
            ret = index2;
        } else if (index2 == -1) {
            ret = index1;
        } else if (index1 > index2) {
            ret = index2;
        } else if (index1 < index2) {
            ret = index1;
        }
        return ret;

    }

}

5个回答

这个if循环用的太多了,但是可以看出是正确的。。。难道遇到什么问题了嘛?

https://ideone.com/l1rm8B
可以编译运行。

你可以点fork,在input里面输入一个表达式,比如1+1,在线测试。

是否正确只要用现有的算法计算的结果与你的算法结果进行比较即可知

看着没啥错误,有错误信息的话,可以贴出来

这个if循环用的太多了,但是可以看出是正确的。。。难道遇到什么问题了嘛?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问