7-8 jmu-Java-02 基本语法 - 07 - 大整数相加
分数:4
作者:郑如滨
单位:集美大学
题目描述:
给定多个大整数,要求对这些数值进行累加运算。由于数值可能超出基本数据类型的表示范围,需采用适当的方法处理大数运算。
输入说明:
多行输入,每行包含一个字符串形式的大整数。持续读取输入,直到某一行的内容为单个字符 'e' 或 'E' 时停止输入。
输入示例:
42846280183517070527831839425882145521227251250327
55121603546981200581762165212827652751691296897789
e
输出示例:
97967883730498271109594004638709798272918548148116
import java.util.*;
public class Main {
public static String add(String num1, String num2) {
// 将字符串转换为字符数组
char[] arr1 = num1.toCharArray();
char[] arr2 = num2.toCharArray();
// 确定结果数组的最大长度(两个数的最大长度 + 1,用于处理最高位进位)
int maxLength = Math.max(arr1.length, arr2.length) + 1;
int[] resultArr = new int[maxLength];
// 从右往左遍历两个数字数组
int i = arr1.length - 1;
int j = arr2.length - 1;
int k = maxLength - 1;
// 进位标志
int carry = 0;
// 当还有数字未处理或还有进位时继续循环
while (i >= 0 || j >= 0 || carry > 0) {
// 获取当前位的数字,若已遍历完则取0
int digit1 = (i >= 0) ? arr1[i--] - '0' : 0;
int digit2 = (j >= 0) ? arr2[j--] - '0' : 0;
// 计算当前位的和(包括进位)
int sum = digit1 + digit2 + carry;
// 更新进位
carry = sum / 10;
// 将当前位的数字(sum % 10)存入结果数组
resultArr[k--] = sum % 10;
}
// 将结果数组转换为字符串
StringBuilder result = new StringBuilder();
// 跳过前导零因为我们开始时预留了一位,所以永远比位数最大的还大一位,此刻判断如0333,则直接从下标1开始333
int startIndex = (resultArr[0] == 0) ? 1 : 0;
// 构建结果字符串
for (int m = startIndex; m < maxLength; m++) {
result.append(resultArr[m]);
}
return result.toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String numbers[] = new String[999];
int count = 0;
// 读取输入直到遇到'e'或'E'
while (true) {
String input = scanner.nextLine().trim();
// 检查是否为退出标志
if ("e".equalsIgnoreCase(input)) {
break;
}
numbers[count++] = input;
}
// 计算所有大整数的和
String sum = "0";
// 只遍历实际输入的元素(0到count-1)
for (int i = 0; i < count; i++) {
sum = add(sum, numbers[i]);
}
// 输出结果
System.out.println(sum);
}
}

雷达卡


京公网安备 11010802022788号







