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(); } }
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html