Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解
int范圍
int64所能表示的數(shù)字范圍為$-2^{63} 到 2^{63}-1$,即·-9223372036854775808~9223372036854775807·,
(19位長度)
當(dāng)超過這一數(shù)字,則會溢出
fmt.Println(9223372036854775808)
執(zhí)行結(jié)果:
constant 9223372036854775808 overflows int
但當(dāng)有相關(guān)需求,如假設(shè)π小數(shù)點后50位乘以$10^{50}$的值為a1,
e小數(shù)點后30位乘以$10^{30}$的值為a2,現(xiàn)需要計算a1+a2,以及a1-a2的值;
即對兩個可正可負的字符串型整數(shù)str1和str2,計算str1+str2的值
1.當(dāng)兩數(shù)皆為正整數(shù)
如a1+a2
一些必要操作,如去除最左邊的所有0,在代碼中不做展現(xiàn),
默認已通過strings.TrimLeft(str,"0")處理為不是以0開頭的正整數(shù)
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) //因為可能存在兩個數(shù)的最高位相加大于10的情況,故而比兩者中最大數(shù)的位數(shù)+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
}
//匯總字符串結(jié)果
for _,i := range num{
s:=strconv.Itoa(i)
res+=s
}
//去除開頭可能存在的0
if len(res) > 1 {
res = strings.TrimLeft(res,"0")
}
return
}運行結(jié)果:
314159265358979323848982620156409333655077227408862
2.當(dāng)兩數(shù)可能為負整數(shù)
即a1-a2,或a2-a1,或-a1-a2
當(dāng)兩數(shù)皆為負數(shù),先把負號取出,這樣就和兩個正整數(shù)相加無異,
最后得出結(jié)果再加上負號~
當(dāng)兩數(shù)一正一負,
如下代碼,默認已做如下處理,a1為正,a2為負,且a1的絕對值>a2的絕對值
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
}
//匯總字符串結(jié)果
for _,i := range num{
s:=strconv.Itoa(i)
res+=s
}
//去除開頭可能存在的0
if len(res) > 1 {
res = strings.TrimLeft(res,"0")
}
return
}運行結(jié)果:
314159265358979323843546056499491243184356652466158
思考:
當(dāng)str1,str2未必為整數(shù)型字符串,而可能是小數(shù)型時,該如何處理?
以及超大字符串型整數(shù)的乘除問題,如何處理
以上就是Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解的詳細內(nèi)容,更多關(guān)于Go處理超大字符串型整數(shù)加減的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Go語言中自定義結(jié)構(gòu)體能作為map的key嗎
在Go中,引用類型具有動態(tài)的特性,可能會被修改或指向新的數(shù)據(jù),這就引發(fā)了一個問題—能否將包含引用類型的自定義結(jié)構(gòu)體作為map的鍵呢,本文就來和大家想想講講2023-06-06
golang架構(gòu)設(shè)計開閉原則手寫實現(xiàn)
這篇文章主要為大家介紹了golang架構(gòu)設(shè)計開閉原則手寫實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
構(gòu)建Golang應(yīng)用最小Docker鏡像的實現(xiàn)
這篇文章主要介紹了構(gòu)建Golang應(yīng)用最小Docker鏡像的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
GoFrame通用類型變量gvar與interface基本使用對比
這篇文章主要為大家介紹了GoFrame通用類型變量gvar與interface基本使用對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

