超长正整数相加

【题目】超长整数相加

  • 请设计一个算法完成两个超长正整数的加法。

方法一:

  • ①将超长整数看作字符床,用字符串进行读取
  • ②遍历字符串,把接收到的字符存到数组(int型)
		for (int i = 0; i < lenA; i++) {
            arrA[i] = addend.charAt(lenA - 1 - i) - '0';//把字符转化位整型
        }
  • ③申请新的数组存储,存储各个位运算的结果(此处就是正常的十进制运算,满十进一)
		for (int i = 0; i < lenS; i++) {
            int sum = arrS[i] + arrA[i] + arrB[i];
            int flag = sum / 10;
            arrS[i] = sum % 10;
            arrS[i + 1] += flag;
        }

注意:

  • ①新申请的数组长度位读取到字符串的最大长度+1
  • ②此时得到的数组并不是最终结果:a.顺序是反的;b.可能存在多余的0 —>因此就需要我们进行下一笔操作,对数组进行整理:a.从后往前遍历数组,去掉多余的0:b.多余的0去掉之后同样从后往前遍历数组,进行最后结果的输出
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author yolo
 * @date 2019/11/20-17:56
 */
public class Main06 {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
            String str1=input.nextLine();
            String str2=input.nextLine();
            System.out.println(AddLongInteger(str1,str2));
        }

    }
    public static String AddLongInteger(String addend,String augend) {
        // 求出两个字符串中较长的那个字符串长度
        int lenA = addend.length();
        int lenB = augend.length();
        int lenS = Math.max(lenA, lenB);

        // arrS保存最终生成的结果
        int[] arrA = new int[lenS];
        int[] arrB = new int[lenS];
        int[] arrS = new int[lenS + 1];

        for (int i = 0; i < lenA; i++) {
            arrA[i] = addend.charAt(lenA - 1 - i) - '0';
        }

        for (int i = 0; i < lenB; i++) {
            arrB[i] = augend.charAt(lenB - 1 - i) - '0';
        }

        for (int i = 0; i < lenS; i++) {
            int sum = arrS[i] + arrA[i] + arrB[i];
            int flag = sum / 10;
            arrS[i] = sum % 10;
            arrS[i + 1] += flag;
        }
        int index = arrS.length-1;
        while (arrS[index] != 0) {
            index--;
        }
        int[] result = Arrays.copyOfRange(arrS, 0, index);
        String str="";
        for (int i = result.length - 1; i >= 0; i--) {
            str+=result[i];
        }
        return str;
    }
}

方法二: 使用BigInteger类

①把读取到的字符串通过构造方法BigInteger(String val)转化为BigInteger类型

构造方法:BigInteger(String val) :将BigInteger的十进制字符串表示形式转换为BigInteger。
使用:
			BigInteger num1=new BigInteger(s1);
            BigInteger num2=new BigInteger(s2);

②调用BigInteger类中的add方法,进行结果运算
在这里插入图片描述

import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
            String s1=input.next();
            String s2=input.next();
            BigInteger num1=new BigInteger(s1);
            BigInteger num2=new BigInteger(s2);
            System.out.println(num1.add(num2));
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值