题目1:字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注:不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路:由于在字符串上进行操作,所以不难想到字符串的拼接(append),又由于字符串中的字符是表示ANSI值不能直接将其视为数字进行拼接,所以便想到让其与’0’字符作差后再进行作和和拼接。
具体代码如下:
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int tmp = 0;
int a = num1.length() - 1;
int b = num2.length() - 1;
while (a >= 0 || b >= 0 || tmp != 0) {//此处的tmp != 0是处理类似80+20=100这种进位的情况发生
if (a >= 0) {
tmp += num1.charAt(a--) - '0';
}
if (b >= 0) {
tmp += num2.charAt(b--) - '0';
}
sb.append(tmp % 10);//只拼接当前下标的一位数字,超出的位数的数字进给下一个下标进行处理
tmp /= 10;
}
return sb.reverse().toString();
}
题目二:字符串相减
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的差。
(默认num1比num2大)
注:不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路:减法是加法的逆运算,所以基本思路与上述思路相似,只不过要注意减法中的借位的处理方式。
具体代码如下:
public String subString(String num1,String num2) {
StringBuilder sb = new StringBuilder();
int amd = 0;
int count = 0;//用于处理借位
int a = num1.length() - 1;
int b = num2.length() - 1;
while (a >= 0) {
int tmp = num1.charAt(a--) - '0' - count;
if (b == -1) {
amd = 0;
}
if (b >= 0) {
amd = num2.charAt(b--) - '0';
}
if (tmp < amd) {
sb.append(tmp - amd + 10);
count = 1;
}
else {
sb.append(tmp - amd);
count = 0;
}
}
int i = sb.length() - 1;
while (i > 0 && sb.charAt(i) == '0') {//记录多余的字符'0'
i--;
}
return sb.reverse().toString().substring(sb.length() - i - 1);
}
题目三:字符串相乘
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的积。
注:不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路:由于乘法和加法不一样,可能会产生许多新的下标位,所以此时便想到新建一个数组的来保存并操作数据,最后再把数组作为字符串返回即可。至于如何操作数组元素,核心思想与加法类似。
具体代码如下:
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
StringBuilder sb = new StringBuilder();
int a = num1.length() - 1;
int b = num2.length() - 1;
int[] arr = new int[num1.length() + num2.length()];//保存并操作数据的数组
//两重循环把每一位数因进行的乘积都遍历到
for (int i = a; i >= 0; i--) {
int amd = num1.charAt(i) - '0';
for (int j = b; j >= 0; j--) {
int tmp = num2.charAt(j) - '0';
arr[i + j] += amd * tmp;
if (arr[i + j] >= 10 && (i + j) != 0) {
arr[i + j - 1] += arr[i + j] / 10;
arr[i + j] %= 10;
}
}
}
//arr[0]可以保存两位数字,正好把循环内部的0下标的缺陷弥补上
for (int i = 0; i < arr.length - 1; i++) {
sb.append(arr[i]);
}
return sb.toString();
}
至于字符串的除法,虽然是乘法的逆运算,但是每次的单次除法都会改变被除数的大小,并且还要用到乘法与减法运算,相对前三题而言,复杂太多。有兴趣的读者可以自己尝试,如果有会做的大佬,感谢与我分享。