字符串整数相加--go语言

字符串相加可以使用竖式求和我们使用代码模拟该运算过程。
从后先前取字符 —模拟从低位运算
使用两个指针分别指向两个字符串要求和的字符,求和后,再与后一位的进位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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值