Go语言计算超长数字串
话不多说,上代码
package main
import (
"fmt"
"strconv"
)
//字符串反转函数
func reverse(str string) string {
var result string
strLen := len(str)
for i := 0; i < strLen; i++ {
result = result + fmt.Sprintf("%c", str[strLen-i-1])
}
return result
}
//用来讲将字符串转为数字类型
func transform (s string) int {
number_int, error := strconv.Atoi(s)
if error == nil {
//fmt.Println("转换成功",number_int)
}else {
fmt.Println("转换错误,",error)
}
return number_int
}
//补位函数用来在两串数字不一样长的时候在 少的数字串前加入适量得0 使两串数字 长度一样,方便计算
func cover(ls string,ns string) (string,string,int,int){
var numbers int
l := len(ls)
n := len(ns)
switch {
case l > n:
numbers = l - n
ns = reverse(ns)
for i:=1;i <= numbers;i++ {
ns = ns + "0"}
return ls,reverse(ns),len(ls),len(ns)
case l < n :
numbers = n - l
ls = reverse(ls)
for i:=1;i <= numbers;i++ {
ls = ls + "0"}
return reverse(ls),ns,len(ls),len(ns)
default:
return ls,ns,len(ls),len(ns)
}
}
func main() {
add1 := "123456789012345678900000987654321123456780987968767567354323215766897900789687574657698798568"
add2 := "21398635483795690238996345340287934652879435047320895684325349583749652835837535793426587346912345"
var result string = ""
var jinwei int
//进位符函数 用来控制是否进位
var index1_number,index2_number int
add1,add2,index1_number,index2_number = cover(add1,add2)
//调用补位函数进行补位
for {
var sum int = 0
index1_number--
index2_number--
if index1_number < 0 || index2_number < 0 {
if jinwei != 0 {
sum = jinwei
sum_s := strconv.Itoa(sum)
result = result + sum_s
//用于在所有数字相加完成后 还有进位得数字 将其添加在尾部 (在后方反转后返回)
}
break
//索引号小于0是没有数字可做运算 退出循环
}
num1 := transform(add1[index1_number:index1_number+1])
num2 := transform(add2[index2_number:index2_number+1])
//从两串末尾取值相加,大于10就将进位符修改成为1 并在下一个数字相加时 加上进位得1
if jinwei != 0 {
sum = num1 + num2 + jinwei
jinwei = 0
//进位符 不等于0得时候 后方数字相加 需要进位 于是 加上进位符 在计算值
}else {sum = num1 + num2}
//进位符 为0 表示无进位 直接计算即可
if sum >=10 {
sum_s := strconv.Itoa(sum)
result = result + sum_s[1:]
jinwei = 1
//两位数计算时 值大于10 就取最后一位 填入计算结果串 并将进位符设为1
}else {
sum_s := strconv.Itoa(sum)
result = result + sum_s
//两位数计算时 值小于10 直接将值填入计算结果串
}
}
result = reverse(result) //反转计算结果串 得到真正的计算结果
fmt.Println(result) //返回计算结果串
}
代码解析
- 字符串反转函数利用字符串切片得机制,从后往前取值。(reverse函数)
- 字符串转数字函数,主要用来规避无法转换得情况。(transform)
- 补位函数,先将字符串反转,完事填充上适当的0,填充完毕后在反转(cover函数)
- 程序主体逻辑,才用数学加法得运算方式,从后往前+,大于10就向前进1位