面试常见题目:大数相加的Java实现(考虑负数情况)

本文介绍如何在Java中处理大数相加的问题,特别是在考虑负数的情况下。通过将数字转化为补码形式的整形数组,利用进位原理进行计算。文章包含思路解析、代码实现及字符串转换和结果输出的详细步骤。
摘要由CSDN通过智能技术生成

前言:

在做面试题目时,我们经常看到有这样的题目:将两个很大的数相加,超过100位。
网上可以看到很多答案,但是这些答案大部分都是没有考虑负数的情况。
首先我们已经不能直接用long类型进行表示了。一般输入是两个字符串。最后输出也得是一个字符串。

思路:

对于字符串是无法相加的,那就必须转换成整形数组。然后一位一位的相加。
当然我们得考虑进位的情况。ok,那么负数怎么解决的,这。里想到了计算机组成里面的运算方法。计算机是将整数以补码的方式保存的,这就很好的将减法变为了加法。最后只需要一个加法器就可以进行加减法了(负数相当于减法)。
我们知道计算机的整数二进制保存的,首位是符号位,0代表正,1代表负。求补码是正数补码等于源码,负数补码等于除符号位外取反后加1.。

  • 10进制补码
    这里我们的数是10进制,我们也可以模拟其求补码,具体方法是:我们符号位用0表示正,9表示负(必须是9)。正数和二进制一样,负数用9-i;最后整个数+1。

  • 模拟加法器
    要保证加法器能运行,那么两个数组的长度必须一致,类似于计算机的32位只能和32位相加,而不能兼容64位。这也保证了首位是符号位。
    这样具体实现就很简单了,从最右边开始相加,若有进位就把进位记录下来,下一位相加时把进位加上。

  • 其他内容
    • 字符串转换为数组
      用‘-’代表负数,先处理好‘-’,然后取字符串最大的长度+2(+2的原因是一位保存符号位,一位是用来进位。)。然后就是字符转换数字了。
    • 结果输出
      加法器返回的是补码的数组,那么要输出字符串,先求原码(补码的补码是原码),再处理正负,负显示‘-’。去掉前面的0。

下面是源码



package com.suanfa;


/**
 * @author 作者 E-mail: yufemgg@gmail.com
 * @date 创建时间:2016-4-9 上午10:21:33
 * @version 1.0
 * @Description:
 */
public class LongAdd {
    
    /**
     * 加法器,a,b的位数必须相同,首位为符合位,0代表正,9代表负
     * @param a
     *
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值