Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解
int范圍
int64所能表示的數(shù)字范圍為$-2^{63} 到 2^{63}-1$,即·-9223372036854775808~9223372036854775807·,
(19位長度)
當超過這一數(shù)字,則會溢出
fmt.Println(9223372036854775808)
執(zhí)行結(jié)果:
constant 9223372036854775808 overflows int
但當有相關(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.當兩數(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.當兩數(shù)可能為負整數(shù)
即a1-a2,或a2-a1,或-a1-a2
當兩數(shù)皆為負數(shù),先把負號取出,這樣就和兩個正整數(shù)相加無異,
最后得出結(jié)果再加上負號~
當兩數(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
思考:
當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-06golang架構(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),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05GoFrame通用類型變量gvar與interface基本使用對比
這篇文章主要為大家介紹了GoFrame通用類型變量gvar與interface基本使用對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06