題目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();
}
至於字符串的除法,雖然是乘法的逆運算,但是每次的單次除法都會改變被除數的大小,並且還要用到乘法與減法運算,相對前三題而言,複雜太多。有興趣的讀者可以自己嘗試,如果有會做的大佬,感謝與我分享。