算法基础:大数求和问题
2015-07-03 10:04
621 查看
大数求和:
给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B;
输入:
因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。
输出:
以字符串形式,输出一行,表示A和B的和。
样例输入:
11111111111111111111111111111111111
22222222222222222222222222222222222
样例输出:
33333333333333333333333333333333333
代码实现:
package huawei
import (
"bytes"
"fmt"
"strconv"
"strings"
)
func Test2Base() {
s := add("91111111111111111111111111111111111", "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()
}
给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B;
输入:
因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。
输出:
以字符串形式,输出一行,表示A和B的和。
样例输入:
11111111111111111111111111111111111
22222222222222222222222222222222222
样例输出:
33333333333333333333333333333333333
代码实现:
package huawei
import (
"bytes"
"fmt"
"strconv"
"strings"
)
func Test2Base() {
s := add("91111111111111111111111111111111111", "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()
}
相关文章推荐
- Go语言将支持Android
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法