Java题解 | HJ57 #高精度整数加法#

高精度整数加法

https://www.nowcoder.com/practice/49e772ab08994a96980f9618892e55b6

描述

输入连个用字符串str表示的整数,求它们所表示的数之和
数据范围:1<=len(str)<=10000

输入描述:
输入两个字符串。保证字符串只含有'0-9'字符

输出描述:
输出求和后的结果

示例1:

输入:
9876543210
1234567890

输出:
11111111100

解法

这里所谓的高精度,实际上就是位数很长的数。输入是字符串,且很长,所以输出也只能是字符串。

  • 输入的两个字符串先逆序;
  • 先左到右(先低位再高位)进行遍历上述两个字符串;
  • 遍历到两个字符转为数字进行计算,计算结果可能是1位也可能是2位;个位就放入待输出字符串的第1个位置,十位先等下,等到遍历到第2个字符再一起累加计算,因此类推;
  • 考虑边界。输入的两个字符串有长有短;遍历的次数以长的那个字符串为准。遍历的次数超过短的字符串长度时,短字符串输出为0;
  • 对待输出字符串进行逆序输出即可。
 /*
 * Copyright (c) waylau.com, 2022. All rights reserved.
 */

package com.waylau.nowcoder.exam.oj.huawei;

import java.util.Scanner;

/**
 * HJ57 高精度整数加法.
 * 描述:输入连个用字符串str表示的整数,求它们所表示的数之和
 * 数据范围:1<=len(str)<=10000
 * 输入描述:
 * 输入两个字符串。保证字符串只含有'0-9'字符
 * 输出描述:
 * 输出求和后的结果
 * 示例1:
 * 输入:
 * 9876543210
 * 1234567890
 * 输出:
 * 11111111100
 *
 * @author <a href="">Way Lau</a>
 * @since 2022-08-26
 */
public class HJ057HighPrecisionIntegerAddition {
    public static void main(String[] args) {
        // 输入
        Scanner in = new Scanner(System.in);
        String str1 = in.nextLine();
        String str2 = in.nextLine();

        // 输出
        System.out.println(add(str1, str2));

        // 关闭
        in.close();
    }

    private static String add(String str1, String str2) {
        int len1 = str1.length();
        int len2 = str2.length();
        int len = Math.max(len1,len2);

        StringBuilder sb = new StringBuilder();

        // 进位
        int carry = 0;

        // 从0算到len为止。
        for (int i = 0; i < len; i++) {
            int a1 = 0;
            int a2 = 0;

            // 逆序从低位开始取数
            if (len1 > i) {
                a1 = new StringBuilder(str1).reverse().toString().charAt(i) - '0';
            }
            if (len2 > i) {
                a2 = new StringBuilder(str2).reverse().toString().charAt(i) - '0';
            }

            // 本位数之和再加上进位的数
            int sum = a1 + a2 + carry;

            // 产生新的进位给下个循环用
            carry = sum/10;

            // 个位
            int onesPlace = sum%10;

            sb.append(onesPlace);
        }

        // 遍历完了,如果还有进位
        if (carry>0) {
            sb.append(carry);
        }

        // 逆序输出
        return sb.reverse().toString();
    }
}

参考引用

#华为机考#
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务