首页 > 编程语言 >Java简单实现大数相加

Java简单实现大数相加

时间:2023-08-23 16:22:35浏览次数:43  
标签:return num1 num2 大数 int 相加 charAt Java String

Java简单实现大数相加

public class BigNumberAdd {

    /**
     * 假设两个都是正数
     * @param num1
     * @param num2
     * @return  num1 + num2
     */
    public static String add(String num1, String num2) {
        int m = num1.length();
        int n = num2.length();
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        int index1 = m - 1;
        int index2 = n - 1;
        while (carry != 0 || index1 >= 0 || index2 >= 0) {
            int a = 0;
            int b = 0;
            if (index1 >= 0) {
                a = num1.charAt(index1) - '0';
                index1--;
            }
            if (index2 >= 0) {
                b = num2.charAt(index2) - '0';
                index2--;
            }
            int tmp = (a + b + carry) % 10;
            carry = (a + b + carry) / 10;
            sb.append(tmp);
        }
        sb.reverse();
        return sb.toString();
    }

    /**
     * 比较num1 和 num2 两个谁的绝对值比较大
     * @param num1
     * @param num2
     * @return -1 : num2绝对值较大,
     * 0 : 两个绝对值一样大,
     * 1 : num1绝对值较大
     */
    public static int compareAbsoluteValue(String num1, String num2) {
        // TODO::先不考虑异常的输入
        String s1 = num1.charAt(0) == '-' ? num1.substring(1) : num1;
        String s2 = num2.charAt(0) == '-' ? num1.substring(1) : num2;
        if (s1.length() > s2.length()) {
            return 1;
        }
        else if (s1.length() < s2.length()) {
            return -1;
        }
        else {
            int n = s1.length();
            int index = 0;
            while (index < n) {
                if (s1.charAt(index) > s2.charAt(index)) {
                    return 1;
                }
                else if (s1.charAt(index) < s2.charAt(index)) {
                    return -1;
                }
                index++;
            }
        }
        return 0;
    }

    /**
     * 判断两个数是否同号
     * @param s1
     * @param s2
     * @return  如果同号,返回true;否则返回false
     */
    public static boolean isSameNumber(String s1, String s2) {
//        return (s1.charAt(0) <= '9' && s1.charAt(0) >= '0' && s2.charAt(0) <= '9' && s2.charAt(0) >= '0') ||
//                (s1.charAt(0) == '-' && s2.charAt(0) == '-');
        return isPositive(s1) == isPositive(s2);
    }

    /**
     * 默认两个都是正数,且num1 > num2
     * @param num1
     * @param num2
     * @return num1 - num2
     */
    public static String minus(String num1, String num2) {
        int m = num1.length();
        int n = num2.length();
        int carry = 0;
        int index1 = m - 1;
        int index2 = n - 1;
        StringBuilder sb = new StringBuilder();
        while (carry != 0 || index1 >= 0 || index2 >= 0) {
            int a = 0;
            int b = 0;
            if (index1 >= 0) {
                a = num1.charAt(index1) - '0';
                index1--;
            }
            if (index2 >= 0) {
                b = num2.charAt(index2) - '0';
                index2--;
            }
            int tmp = (a - b - carry);
            if (tmp < 0) {
                tmp += 10;
                carry = 1;
            }
            else {
                carry = 0;
            }
            if (tmp == 0 && index1 == -1) {
                break;
            }
            sb.append(tmp);
        }
        sb.reverse();
        return sb.toString();
    }

    private static boolean isPositive(String num1) {
        return !(num1.charAt(0) == '-');
    }

    public static String addTwoBigNumber(String num1, String num2) {
        boolean isSame = isSameNumber(num1, num2);
        if (isSame) {
            boolean isPositive = isPositive(num1);
            if (isPositive) {
                return add(num1, num2);
            }
            else {
                return "-" + (add(num1.substring(1), num2.substring(1)));
            }
        }
        else {
            int compareResult = compareAbsoluteValue(num1, num2);
            if (compareResult == 0) {
                return "";
            }
            boolean isPositive = isPositive(num1);
            // num2绝对值比较大
            if (compareResult == -1) {
                // num1是正数
                if (isPositive) {
                    return "-" + minus(num2.substring(1), num1);
                }
                else {
                    return minus(num2, num1.substring(1));
                }
            }
            else {
                if (isPositive) {
                    return minus(num1, num2.substring(1));
                }
                else {
                    return "-" + minus(num1.substring(1), num2);
                }
            }
        }
    }
}

标签:return,num1,num2,大数,int,相加,charAt,Java,String
From: https://www.cnblogs.com/ZJHqs/p/17652003.html

相关文章

  • java 读取各种类型的文件 (三)
    后端java,springboot、前端vue:对txt文件的读写,以及前端预览一、后端读publicvoidreadTxt(){InputStreamReaderinput=null;BufferedReaderbuffer_reader=null;ArrayBlockingQueue<String[]>fileData=new......
  • java 读取各种类型的文件 (二)
    1、Filefile=newFile();参数可以是文件夹路径,也可以是文件路径;当newFile()之后只是先在内存中创建了File对象,还没有在磁盘上创建具体文件文件夹;如果参数中的文件或者文件夹已经存在的话,那么File的属性就按已存在的文件或者文件夹赋值;如果不存在则除了文件名......
  • 爬虫之争:Python还是Java?
    在爬虫的世界里,选择合适的编程语言是关键之一。但是面对众多选择,你是选择Python还是Java呢?本文将为你分析Python和Java在爬虫领域的优势与劣势,帮助你做出选择。PythonPython作为一种高级编程语言,简洁明了的语法让人爱不释手。以下是Python在爬虫领域的优势:1.简洁易学:Python语法简单......
  • Java 获取Html标签中各属性值
    该方式适用于取任何标签的任何属性只要对应替换标签名和属性。publicstaticSet<String>getImgStr(StringhtmlStr){Set<String>pics=newHashSet<String>();Stringimg="";Patternp_image;Matcherm_image;StringregEx_img="<......
  • java-将列表格式化成json字符串
    List<String>list=newArrayList<>();list.add("{'county':'china','age':18}");list.add("{'county':'japan','age':28}");......
  • 直播网站程序源码,Java实现图片压缩
    直播网站程序源码,Java实现图片压缩1、Thumbnailator简介    对于图片处理,JDK中也提供了对应的工具类,不过处理起来会很麻烦,而Thumbnailator是一个Google开源的优秀图片处理的第三方Java类库,处理效果远比JavaAPI的好。    Thumbnailator可以使用很少的代码实现......
  • java多线程使用详解与案例,超详细
    一、创建线程的方式1、继承Thread类让子类继承Thread线程类子类必须重写Thread类的run方法创建一个自己定义的线程对象调用start()方法启动线程//测试类/***1、让子类继承Thread线程类*/publicclassThreadTest1extendsThread{//2、子类必须重写Thread类......
  • 途牛科技与火山引擎数智平台合作 打造企业大数据系统“降本”新范式
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 近日,南京途牛科技有限公司与火山引擎数智平台(VeDI)的合作获得新进展:途牛大数据系统全面迁移至火山引擎开源大数据平台E-MapReduce。  作为国内专注休闲旅游的数字一体化旅游服务商......
  • Java反射机制
    Reflection是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。例如,使用它能获得Java类中各成员的名称并显示出来。Java的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。......
  • Java 多线程处理 for 循环数据
    对于必须在for循环内进行查询的场景,可采用以下几种方式进行优化。1、主线程与子线程无先后顺序publicstaticvoidmain(String[]args)throwsInterruptedException{for(inti=0;i<5;i++){ThreadUtil.execAsync(()->{......