一、字符串相加
java
class Solution {
/**
* 该方法用于将两个以字符串形式表示的非负整数相加,并返回相加结果的字符串形式
* @param num1 第一个以字符串形式表示的非负整数
* @param num2 第二个以字符串形式表示的非负整数
* @return 两个数相加结果的字符串形式
*/
public String addStrings(String num1, String num2) {
// 创建一个 StringBuilder 对象,用于存储相加的结果
StringBuilder res = new StringBuilder("");
// i 指向 num1 的最后一个字符,j 指向 num2 的最后一个字符
int i = num1.length() - 1, j = num2.length() - 1;
// carry 用于存储进位,初始化为 0
int carry = 0;
// 从两个字符串的末尾开始逐位相加,只要还有未处理的位就继续循环
while(i >= 0 || j >= 0){
// 如果 i 有效(即 i 不小于 0),将 num1 对应位置的字符转换为数字,否则为 0
int n1 = i >= 0 ? num1.charAt(i) - '0' : 0;
// 如果 j 有效(即 j 不小于 0),将 num2 对应位置的字符转换为数字,否则为 0
int n2 = j >= 0 ? num2.charAt(j) - '0' : 0;
// 计算当前位相加的结果,包括进位
int tmp = n1 + n2 + carry;
// 更新进位,carry 为 tmp 除以 10 的商
carry = tmp / 10;
// 将当前位相加结果的个位数添加到 res 中
res.append(tmp % 10);
// 移动到前一位
i--;
j--;
}
// 如果最后还有进位,将进位 1 添加到结果中
if(carry == 1) res.append(1);
// 由于结果是从低位到高位添加的,需要反转字符串得到正确的顺序
return res.reverse().toString();
}
public static void main(String[] args) {
Solution solution = new Solution();
String num1 = "123";
String num2 = "456";
// 调用 addStrings 方法计算两个字符串表示的数字之和
String result = solution.addStrings(num1, num2);
System.out.println(result);
}
}
二、字符串相乘
java
class Solution {
/**
* 此方法用于计算两个以字符串形式表示的非负整数的乘积,并将结果以字符串形式返回
* @param num1 第一个非负整数的字符串表示
* @param num2 第二个非负整数的字符串表示
* @return 两个数乘积的字符串表示
*/
public String multiply(String num1, String num2) {
// 若其中一个数为 0,则直接返回 0
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
// 获取 num1 的长度
int m = num1.length();
// 获取 num2 的长度
int n = num2.length();
// 两个数相乘结果的最大长度为 m + n,所以创建一个长度为 m + n 的数组来存储中间结果
int[] result = new int[m + n];
// 从 num1 的最后一位开始遍历
for (int i = m - 1; i >= 0; i--) {
// 从 num2 的最后一位开始遍历
for (int j = n - 1; j >= 0; j--) {
// 将当前位的字符转换为数字并相乘
int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
// 计算乘积结果在 result 数组中的位置
int p1 = i + j;
int p2 = i + j + 1;
// 加上之前可能存在的进位
int sum = mul + result[p2];
// 存储当前位的结果
result[p2] = sum % 10;
// 处理进位
result[p1] += sum / 10;
}
}
// 用于构建最终结果的字符串
StringBuilder sb = new StringBuilder();
// 遍历结果数组
for (int num : result) {
// 跳过前导零
if (!(sb.length() == 0 && num == 0)) {
sb.append(num);
}
}
// 返回最终结果的字符串表示
return sb.toString();
}
}