int64所能表示的数字范围为-2^63 ~ 2^63-1,即-9223372036854775808~9223372036854775807,
(19位),当超过这一数字,则会溢出

1
2
3
4
fmt.Println(9223372036854775808)

执行结果:
constant 9223372036854775808 overflows int

但当有相关需求,如假设π小数点后50位乘以10的50次方的值为a1,
e小数点后30位乘以10的30次方的值为a2,现需要计算a1+a2,以及a1-a2的值;

即对两个可正可负的字符串型整数str1和str2,计算str1+str2的值

1.当两数皆为正整数

如a1+a2
一些必要操作,如去除最左边的所有0,在代码中不做展现,
默认已通过strings.TrimLeft(str,”0”)处理为不是以0开头的正整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

func main(){
str1 := "314159265358979323846264338327950288419716939937510"
str2 := "2718281828459045235360287471352"

rs := ""
if len(str1) > len(str2) {
rs = AddStr(str1,str2)
} else{
rs = AddStr(str2,str1)
}
fmt.Println(rs)

}

func AddStr(n1,n2 string)(res string) {
var num []int
x,y := len(n1),len(n2)


num = make([]int,x+1) //因为可能存在两个数的最高位相加大于10的情况,故而比两者中最大数的位数+1

for i :=0;i<y; {
num[x-i] = int(n1[x-1-i]-'0') + int(n2[y-1-i]-'0')
i = i + 1
}

for i:=0;i<x-y;{
num[x-y-i] = int(n1[x-y-i-1]-'0')
i = i + 1
}

//处理进位
for i := len(num);i>1;{
if num[i-1]/10==1 {
num[i-1]-=10
num[i-2]++
}
i = i - 1
}

//汇总字符串结果

for _,i := range num{
s:=strconv.Itoa(i)
res+=s
}

//去除开头可能存在的0
if len(res) > 1 {
res = strings.TrimLeft(res,"0")
}
return
}

运行结果:

1
314159265358979323848982620156409333655077227408862

2.当两数可能为负整数

即a1-a2,或a2-a1,或-a1-a2

当两数皆为负数,先把负号取出,这样就和两个正整数相加无异,
最后得出结果再加上负号~

当两数一正一负,
如下代码,默认已做如下处理,a1为正,a2为负,且a1的绝对值>a2的绝对值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  
func main(){

str1 := "314159265358979323846264338327950288419716939937510"
str2 := "-2718281828459045235360287471352"
str2 = strings.TrimLeft(str2,"-")

res := subtractStr(str1,str2)

fmt.Println(res)
}


func subtractStr(n1,n2 string)(res string) {
var num []int
x,y := len(n1),len(n2)

num= make([]int,x+1)

for i := 0;i < y; {
num[x-i] = int(n1[x-1-i]-'0') - int(n2[y-1-i]-'0')
i = i + 1
}

for i:=0;i<x-y;{
num[x-y-i] = int(n1[x-y-i-1]-'0')
i = i + 1
}

//处理进位
for i := len(num);i>1;{
if num[i-1] < 0 {
num[i-1]+=10
num[i-2]--
}
i = i- 1
}

//汇总字符串结果

for _,i := range num{
s:=strconv.Itoa(i)
res+=s
}

//去除开头可能存在的0
if len(res) > 1 {
res = strings.TrimLeft(res,"0")
}
return
}

运行结果:

1
314159265358979323843546056499491243184356652466158

思考:当str1,str2未必为整数型字符串,而可能是小数型时,该如何处理?

以及超大字符串型整数的乘除问题,如何处理