字符串相加可以使用竖式求和我们使用代码模拟该运算过程。
从后先前取字符 —模拟从低位运算
使用两个指针分别指向两个字符串要求和的字符,求和后,再与后一位的进位1或者0相加后,得到计算结果为w;
是否有进位,确定真正的这一位—模拟进位
判断w是否大于10 ,如果大于10那么就产生进位1,计算结果记w%10为否者设置进位为0,计算结果就记w,有后向前存到切片数组中;
循环执行以上两步
两个指针向前移动,循环执行,如果某个指针指向负数,那么将对应的字符作为0参与运算,直到所有的字符参与运算。
最后还要看最高位运算是否有就进位。
注意点:
从字符串中取出的字符是对应字符的ASCII码,对其操作的时候需要 -'0’
例如:
字符串“4” 对应 ASCII码为 52
如果我们想要把他变成对应的数字4就需要转换为 ‘4’ - ‘0’ = 4
青色的最好记一下,以后可能会用到
func addStrings(num1 string, num2 string) string {
var x, y, z byte
//取大的长度
var ln int
if len(num1) > len(num2) {
ln = len(num1)
} else {
ln = len(num2)
}
//保存结果的切片
ans := make([]byte, ln+1)
p, q := len(num1)-1, len(num2)-1
for i := ln; i > 0; i-- {
//两个指针指向低位
if p >= 0 {
x = num1[p] - '0'
} else {
x = 0
}
if q >= 0 {
y = num2[q] - '0'
} else {
y = 0
}
wei := x + y + z //计算
if wei < 10 {
z = 0
} else {
z = 1
wei %= 10
}
//保存结果
ans[i] = wei + '0'
p--
q--
}
if z == 1 {
ans[0] = 1 + '0'
} else {
ans = ans[1:]
}
return string(ans)
}
当然你也可以看下边官方的题解
们定义两个指针 i 和 j 分别指向num 1 和num 2 的末尾,即最低位,同时定义一个变量add维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理
func addStrings2(num1 string, num2 string) string {
add := 0 //开始进位为0
ans := ""
for i, j := len(num1)-1, len(num2)-1; i >= 0 || j >= 0 || add != 0; i, j = i-1, j-1 {
var x, y int
if i >= 0 {
x = int(num1[i] - '0')
}
if j >= 0 {
y = int(num1[j] - '0')
}
result := x + y + add
ans = strconv.Itoa(result%10) + ans //高位 + 低位
add = result / 10
}
return ans
}