这是我自己写的代码,就一个文件,直接可以编译通过,思路是将两个要相加的数,看成字符串,为了方便进位计算,将原始要相加的数的短的一个前面补足上0,考虑到会有可能最后的结果会多出一位,将原始的要相加的数字和结果都再多算一位,最后出结果时,再扔掉开头的0。
//Copyright 2020 David Chang. All rights reserved. //该练习实现两个巨大正整数的相加 package main import ( "fmt" "strings" "time" ) var ( n, m, result string ) func init() { fmt.Println("这个程序执行两个巨大整数的相加:") fmt.Println("请输入第一个数:") for { fmt.Scanf("%s", &n) if !isNumber(n) { fmt.Println("您输入的不是一个整数,请重新输入:") } else { break } } fmt.Println("您输入的第一个数为:") fmt.Println(n, ", 共有", len(n), "位") fmt.Println("请输入第二个数:") for { fmt.Scanf("%s", &m) if !isNumber(m) { fmt.Println("您输入的不是一个整数,请重新输入:") } else { break } } fmt.Println("您输入的第二个数为:") fmt.Println(m, ", 共有", len(m), "位") fmt.Println("开始计算……") } func isNumber(str string) bool { for i, v := range str { switch i { case 0: if v <= 48 || v > 57 { return false } default: if v < 48 || v > 57 { return false } } } return true } func calBig(a, b string) (c string) { if len(a) < len(b) { a, b = b, a } tmpgap := len(a) - len(b) for i := 0; i <= tmpgap; i++ { b = "0" + b } c = "0" + a a = "0" + a tmpa, tmpb, tmpc := []byte(a), []byte(b), []byte(c) jw := false for j := len(c) - 1; j >= 0; j-- { if jw { tmpc[j] = tmpa[j] + tmpb[j] - 48 + 1 if tmpc[j] > 57 { tmpc[j] -= 10 jw = true } else { jw = false } } else { tmpc[j] = tmpa[j] + tmpb[j] - 48 if tmpc[j] > 57 { tmpc[j] -= 10 jw = true } else { jw = false } } } c = string(tmpc[:]) return strings.TrimPrefix(c, "0") } func formatOutput(a, b string) (string, string) { transfered := false if len(a) < len(b) { a, b = b, a transfered = true } tmpgap := len(a) - len(b) for i := 0; i < tmpgap; i++ { b = "0" + b } if transfered { return b, a } else { return a, b } } func main() { start := time.Now().UnixNano() tmpn, tmpm := formatOutput(n, m) fmt.Println(tmpn) fmt.Println(" +") fmt.Println(tmpm) fmt.Println(" =") result = calBig(n, m) fmt.Println(result) end := time.Now().UnixNano() fmt.Printf("共用了%d微秒\n", (end-start)/1000) }