zoukankan      html  css  js  c++  java
  • 字符串解析运算符加减法(不使用BIgInterge)的方法,麻烦帮我看下

    今天写一个字符串加减法(不使用BIgInterge)的方法,麻烦大家帮我看下有无问题:

    public class StringCalculator {
        public static void main(String[] args) {
            // test
            System.out.println(parseStrAri("99+1+99+1-99="));
        }
    
        // 解析加减运算
        private static String parseStrAri(String dest) {
            // 运算数组
            String[] nums = dest.split("\+|-|=");
            //运算符号
            char[] ops = dest.replaceAll("[0-9]", "").toCharArray();
            // 校验参数
            if (nums.length == 0 || ops.length == 0) {
                throw new IllegalArgumentException("输入参数不正确,不符合表达式");
            }
            int numIndex = 0;
            String result = nums[0];
            for (char c : ops) {
                switch (c) {
                    case '+':
                        // -result +b 按照 -(a-b) 处理  -1000+ 20000
                        if ("-".equals(result.substring(0,1))){
                            String numA =  expunge(result);
                            String numB =  nums[++numIndex];
                            if (isLeftBig(numA,numB)){
                                result = subtractionStr(numA, numB);
                                result = "-"+result;
                            }else {
                                result = subtractionStr(numB, numA);
                            }
                        }else {
                            result = additionStr(result, nums[++numIndex]);
                        }
                        break;
                    case '-':
                        String numB =  nums[++numIndex];
                        if ("-".equals(result.substring(0,1))){
                            String numA = expunge(result) ;
                            result = additionStr(numA, numB);
                            result = "-"+result;
                        } else {
                            String numA = result ;
                            if (isLeftBig(numA,numB)){
                                result = subtractionStr(numA, numB);
                            }else {
                                result = subtractionStr(numB, numA);
                                result = "-"+result;
                            }
                        }
                        break;
                    case '=':
                        return result;// 这里返回结果
                    default:
                        // ignore
                }
            }
    
            return result;
        }
    
        // add 加法
        private static String additionStr(String a, String b) {
            StringBuilder builder = new StringBuilder();
            a = reverse(a);
            b = reverse(b);
            // 调换
            if (a.length() < b.length()) {
                String c = b;
                b = a;
                a = c;
            }
            int aLen = a.length();
            int bLen = b.length();
    
            boolean isOver = false;
            for (int i = 0; i < aLen; i++) {
                int result = 0;
                int charA = a.charAt(i) - 48;
                if (i < bLen) {
                    int charB = b.charAt(i) - 48;
                    result = charA + charB;
                } else {
                    result = result + charA;
                }
                // 进位
                if (isOver) {
                    result++;
                }
                if (result >= 10) {
                    builder.append(result - 10);
                    isOver = true;
                } else {
                    builder.append(result);
                    isOver = false;
                }
            }
            if (isOver){
                builder.append("1");
            }
            return reverse(builder.toString());
        }
    
        // sub 减法
        private static String subtractionStr(String a, String b) {
            StringBuilder builder = new StringBuilder();
            a = reverse(a);
            b = reverse(b);
            // 调换
            if (a.length() < b.length()) {
                throw new IllegalArgumentException("字符串有误");
            }
    
            int aLen = a.length();
            int bLen = b.length();
            byte isOver = 0;//  借位
    
            for (int i = 0; i < aLen; i++) {
                int result = 0;
                int charA = a.charAt(i) - 48;
                result = result + isOver;
                isOver = 0;
                if (i < bLen) {
                    int charB = b.charAt(i) - 48;
                    result = result + charA;
                    if (result < 0) {
                        result += 10;
                        isOver--;
                    }
                    result = result - charB;
                    if (result < 0) {
                        result += 10;
                        isOver--;
                    }
                } else {
                    result = charA + result;
                    if (result < 0) {
                        result += 10;
                        isOver--;
                    }
                }
                builder.append(result);
            }
            return expungeZero(reverse(builder.toString()));
        }
    
        // 反序
        private static String reverse(String value) {
            if (value == null || value.length() <= 1) {
                return value;
            }
            return reverse(value.substring(1)) + value.charAt(0);
        }
    
        // 取零的前缀
        private static String expungeZero(String s) {
            return s.replaceFirst("^0*", "");
        }
    
        private static String expunge(String s){
            return s.replaceFirst("^-*", "");
        }
    
        private static boolean isLeftBig(String a,String b){
            if (a.length() == b.length()){
                return a.compareTo(b)>0;
            }
            if (a.length() > b.length()){
                return true;
            }
            return false;
        }
    
    }
  • 相关阅读:
    [php代码]从svn获取指定版本,并同步到ftp上。
    java程序用pid重启
    Gearman安装,测试笔记
    ant编译android项目
    jquery代码收藏
    [读书笔记]读《code complete》有感
    无法解析的外部符号_main,该符号在函数_tmainCRTStartup中被引用
    4路电梯调度——pair program总结
    阅读作业2
    必应缤纷桌面的使用测试
  • 原文地址:https://www.cnblogs.com/immer/p/11209787.html
Copyright © 2011-2022 走看看