大整数加法

大整数加法
题目描述详见http://noi.openjudge.cn/ch0106/10/。
【解题思路】:本题显然考核大整数类的应用。也有另外一种解题思路:先比较两个输入的字符数字长度,判断其最大串长度,以此为模板创建数组,构建竖式计算,较小的左边至为0,需要使用进位变量来控制。
【程序代码】:详见如下代码。

package com.demo.course.mid.problem01;


/**
 * author: nitaotao
 * date: 2021/12/21 0:28
 * version: 1.0
 * description: http://noi.openjudge.cn/ch0106/10/
 */

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String num1 = scanner.next();
        String num2 = scanner.next();
        Main main = new Main();
        System.out.println(main.sum(num1,num2));
//        main.sumByArr(num1, num2);
    }


    /**
     * sum方法:对大整数进行加法运算
     *
     * @param num1 大整数1
     * @param num2 大整数2
     * @return
     */
    public BigInteger sum(String num1, String num2) {
        BigInteger bigInteger1 = new BigInteger(num1);
        BigInteger bigInteger2 = new BigInteger(num2);
        return bigInteger1.add(bigInteger2);
    }

    /**
     * sumByArr方法:对大整数进行加法运算
     *
     * @param num1 大整数1
     * @param num2 大整数2
     * @return
     */
    public void sumByArr(String num1, String num2) {
        //把长度较长的作为num1,长度较短的作为num2
        //判断最大长度,进行竖式计算
        if (num1.length() < num2.length()) {
            String temp = num2;
            num2 = num1;
            num1 = temp;
        }

        //两个数分割成数组
        String[] num1Str = num1.split("");
        String[] num2Str = num2.split("");
        //化两个数分割为等长数组
        //位置计数器,用来对齐竖式计算
        int indexNum2 = num2Str.length - 1;
        //如果num1位数较多
        String[] newNum2 = new String[num1.length()];
        for (int i = newNum2.length - 1; indexNum2 > -1 || i > -1; i--) {
            //一位一位对齐,从后往前
            if (indexNum2 < 0) {
                //因为String数组默认为null而不是0,所以要手动至0
                newNum2[i] = "0";
            } else {
                newNum2[i] = num2Str[indexNum2];
                indexNum2--;
            }
        }
        /**处理之后的结果
         * 22222222222222222222
         * 00000033333333333333
         */
        int temp = 0; //进位标记
        String[] result = new String[num1Str.length + 1];
        //初始化为0
        result[0] = "0";
        for (int i = num1Str.length - 1; i > -1; i--) {
            result[i + 1] = String.valueOf((Integer.parseInt(num1Str[i]) + Integer.parseInt(newNum2[i]) + temp) % 10);
            //进位标志
            temp = Integer.valueOf(num1Str[i]) + Integer.valueOf(newNum2[i]) + temp > 9 ? 1 : 0;
        }
        //首位进位
        result[0] = temp == 0 ? "0" : "1";

        //判断是不是全是0
        int count = 0;
        for (int i = 0; i < result.length; i++) {
            if (result[i].equals("0")) {
                count++;
            }
        }
        if (count == result.length) {
            //如果全是0
            System.out.print("0");
        } else {

            //输出时注意首位不能为0
            boolean flag = false;
            for (int i = 0; i < result.length; i++) {
                if (flag) {
                    //已判断前有不为0的数
                    System.out.print(result[i]);
                } else {
                    if (!result[i].equals("0")) {
                        //已找到首位不为0的数
                        System.out.print(result[i]);
                        flag = true;
                    }
                }
            }
        }
    }



}

【运行结果】:详见如下截图。
在这里插入图片描述

图11 两种方法大整数加法程序分别运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值