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