加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

算法基础:大数求和问题

发布时间:2020-12-14 02:29:42 所属栏目:大数据 来源:网络整理
导读:大数求和: 给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B; 输入: 因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。 输出: 以字符串形式,输出一行,表示A和B的和。 样例输入: 22222222222222222222222
大数求和:
给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B;

输入:
因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。

输出:
以字符串形式,输出一行,表示A和B的和。


样例输入:
22222222222222222222222222222222222
22222222222222222222222222222222222

样例输出:

33333333333333333333333333333333333

代码实现:

package huawei

import (
	"bytes"
	"fmt"
	"strconv"
	"strings"
)

func Test2Base() {
	s := add("92222222222222222222222222222221111","122222222222222222222222222222222222")
	fmt.Println(s)
}

func add(a string,b string) string {
	//位数较少的,高位补0
	if len(a) < len(b) {
		a = strings.Repeat("0",len(b)-len(a)) + a
	} else if len(a) > len(b) {
		b = strings.Repeat("0",len(a)-len(b)) + b
	}

	strLen := len(a)
	//保存结果的数组,从低位到高位进行保存
	nums := make([]uint8,strLen)
	//从低位到高位开始遍历a,b
	addOne := false
	for i := 0; i < strLen; i++ {
		num_a := a[strLen-i-1] - '0'
		num_b := b[strLen-i-1] - '0'

		sum := num_a + num_b
		if addOne {
			sum++
		}

		if sum > 9 {
			//进位
			sum -= 10
			addOne = true
		} else {
			addOne = false
		}

		nums[i] = sum
	}

	result := convertToString(nums)
	//进位,最前面补1
	if addOne {
		result = "1" + result
	}

	return result
}

func convertToString(nums []uint8) string {
	var b bytes.Buffer
	for i := len(nums) - 1; i >= 0; i-- {
		b.WriteString(strconv.Itoa(int(nums[i])))
	}

	return b.String()
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读