首页 > 编程语言 >存在正负数的大数加法 java实现

存在正负数的大数加法 java实现

时间:2022-11-23 13:23:39浏览次数:55  
标签:java String num2 大数 int 正负数 length return num1

package top.chitucao.algorithm.Math;

import java.util.Objects;

/**
 * @author chitucao
 * @since 2022/11/23 10:10
 * 大数加法,包括正负的情况
 * 参考 https://developer.aliyun.com/article/1057265
 */
public class LargeNumber {

    public static void main(String[] args) {
        String num1 = "123";
        String num2 = "-456";
        System.out.println(new LargeNumber().add(num1, num2));
    }

    public String add(String num1, String num2) {

        boolean isPositiveNum1 = num1.charAt(0) != '-';
        boolean isPositiveNum2 = num2.charAt(0) != '-';

        if (isPositiveNum1 && isPositiveNum2) {
            return doAdd(num1, num2);
        } else if (!isPositiveNum1 && !isPositiveNum2) {
            return negate(doAdd(num1.substring(1), num2.substring(1)));
        } else if (isPositiveNum1 && !isPositiveNum2) {
            return doSub(num1, num2.substring(1));
        } else {
            return doSub(num2, num1.substring(1));
        }
    }

    // 相加
    private String doAdd(String num1, String num2) {
        int len1 = num1.length() - 1;
        int len2 = num2.length() - 1;
        int carry = 0;

        StringBuilder sb = new StringBuilder();

        while (len1 >= 0 || len2 >= 0) {
            int n1 = len1 >= 0 ? num1.charAt(len1--) - '0' : 0;
            int n2 = len2 >= 0 ? num2.charAt(len2--) - '0' : 0;
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            sb.append(sum % 10);
        }

        // 这里注意进位
        if (carry > 0) {
            sb.append(1);
        }

        return sb.reverse().toString();
    }

    // 相减
    private String doSub(String num1, String num2) {
        if (!compare(num1, num2)) {
            return negate(doSub(num2, num1));   // 保证num1>=num2
        }

        int len1 = num1.length() - 1;
        int len2 = num2.length() - 1;
        int borrow = 0;

        StringBuilder sb = new StringBuilder();

        while (len1 >= 0 || len2 >= 0) {
            int n1 = len1 >= 0 ? num1.charAt(len1--) - '0' : 0;
            int n2 = len2 >= 0 ? num2.charAt(len2--) - '0' : 0;
            int num = n1 - n2 - borrow;

            // 借位
            if (num < 0) {
                borrow = 1;
                num += 10;
            }
            sb.append(num);
        }

        // 反转后去掉前导0  22-14=08
        sb.reverse();
        int idx = 0;
        while (idx < sb.length() && sb.charAt(idx) == '0') {
            idx++;
        }
        // 等于0的特殊情况
        if (idx == sb.length()) {
            return "0";
        }

        return sb.substring(idx);
    }

    // num1是否大于等于num2
    private boolean compare(String num1, String num2) {
        if (num1.length() == num2.length()) {
//            return num1.compareTo(num2) >= 0;
            for (int i = 0; i < num1.length(); i++) {
                if (num1.charAt(i) < num2.charAt(i)) {
                    return false;
                }
            }
            return true;
        } else {
            return num1.length() > num2.length();
        }
    }

    // 反转正负情况
    private String negate(String num) {
        if (num.charAt(0) == '-') {
            return num.substring(1);
        } else if (Objects.equals(num, "0")) {
            return num;
        } else {
            return "-" + num;
        }
    }

}

  

标签:java,String,num2,大数,int,正负数,length,return,num1
From: https://www.cnblogs.com/chitucao/p/16917964.html

相关文章

  • 银行家算法(Java)
    系统安全状态安全状态指系统能按某种进程推进顺序(P1,P2,...,Pn)未每个进程Pi分配器所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利的完成,此时成(P1,P2,...,Pn)为......
  • 一文带你吃透java中的继承
    继承继承的概念面向对象的三大特征:封装性、继承性、多态性。继承是多态的前提,如果没有继承,就没有多态。继承关系当中的特点:1.子类可以拥有父类的“内容”。2.子类......
  • java8 升级 17 兼容测试 emt4j
    测试兼容性的,emt4j 在readme里download节目,点击下载 https://github.com/adoptium/emt4j /root/emt4j-0.3/bin/analysis.sh-f8-t17-o/home/jdk8to17.h......
  • Java基本数据类型
    1八种数据类型   1、整型:byte、short、int、long2、字符型:char3、浮点型:float、double4、布尔型:boolean 2用法byte(-128~127),8位、有符号的以二进制......
  • 随想录(对比着c学java)
    【声明:版权所有,欢迎转载,请勿用于商业用途。  对于java,有两种论调。一种是鄙视,认为java是个人都能学,完全体现不出程序员的水平。还有一种,就是拔高java,认为java无所不能,j......
  • Java 网络编程(七)URL
    URL:https://www.baidu.com/协议://ip地址:端口/项目名/资源 统一资源定位符:定位资源的,定位互联网上的某一个资源DNS域名解析www.baidu.com publicclassURLDem......
  • windows注册java的jar包为服务
    下载nssm,以管理员身份运行命令控制台:nssminstall InfluxDB 在打开的窗口中选择在path填上java路径,在Startupdirectory填上jar包目录Arguments填上参数Servicename......
  • Java 网络编程(六)UDP
    UDP发短信:不用连接,需要知道对方的地址客户端://不需要连接服务器publicclassUdpClientDemo01{publicstaticvoidmain(String[]args)throwsException{......
  • 28个Javascript 数组方法提高开发效率
    28个Javascript数组方法清单列表web前端开发 2022-11-2310:05 发表于上海01、Array.map()返回一个新数组,其中包含对该数组中每个元素调用提供的函数的结果。const......
  • 【Java】Map
    遍历StringinsertKeyStr="";StringinsertValStr="";Integeri=0;for(Objectkey:map.keySet()){Objectvalue=map.get(key);insertKeyStr+=......