高精度

加法

python

# 高精度整数相加
def add(a: str, b: str):
    if len(a) < len(b):
        return add(b, a)

    # 从个位开始累加
    a_list = [int(c) for c in reversed(list(a))]
    b_list = [int(c) for c in reversed(list(b))]

    ans_list = list()
    t = 0
    for i in range(len(a)):
        t += a_list[i]
        if i < len(b):
            t += b_list[i]
        ans_list.append(t % 10)
        t //= 10

    ans = ""
    if not t:
        while ans_list:
            ta = str(ans_list.pop())
            if ta == '0':
                continue
            else:
                ans = ta
                break
    else:
        ans = str(t)

    while ans_list:
        ans += str(ans_list.pop())

    return ans


if __name__ == '__main__':
    from random import randint

    for _ in range(1024):
        a = randint(100000, 1000000)
        b = randint(100, 10000)
        if add(str(a), str(b)) != str(a + b):
            print(a, b, add(str(a), str(b)), a + b)

go

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    var reader = bufio.NewReader(os.Stdin)
    var x = readArray(reader)
    var y = readArray(reader)
    fmt.Println(add(x, y))
}

func add(x, y []int) string {
    if len(x) > len(y) {
        x, y = y, x
    }
    var (
        jw     int
        i      int
        length = len(x)
        ly     = len(y)
        ans    string
        sum    int
    )

    for i < length {
        sum = x[length-i-1] + y[ly-i-1] + jw
        jw = sum / 10
        ans = strconv.Itoa(sum%10) + ans
        i++
    }

    for i < ly {
        sum = y[ly-i-1] + jw
        jw = sum / 10
        ans = strconv.Itoa(sum%10) + ans
        i++
    }

    if jw == 1 {
        ans = "1" + ans
    }
    return ans
}

func readLine(reader *bufio.Reader) string {
    var line, _ = reader.ReadString('\n')
    return strings.TrimRight(line, "\n")
}

func readArray(reader *bufio.Reader) []int {
    var line = readLine(reader)
    var strList = strings.Split(line, "")
    var nums = make([]int, 0)
    var err error
    var v int
    for i := 0; i < len(strList); i++ {
        if v, err = strconv.Atoi(strList[i]); err != nil {
            continue
        }
        nums = append(nums, v)
    }
    return nums
}

减法

python

# a >= b; a>=0. b>=0
def sub(a, b):
    a_list = [int(c) for c in reversed(list(a))]
    b_list = [int(c) for c in reversed(list(b))]

    ans_list = list()
    t = 0
    for i in range(len(a)):
        t = a_list[i] - t
        if i < len(b):
            t -= b_list[i]
        ans_list.append((t + 10) % 10)
        if t < 0:
            t = 1
        else:
            t = 0

    ans = str()
    if not t:
        while ans_list:
            ta = str(ans_list.pop())
            if ta == '0':
                continue
            else:
                ans = ta
                break
    else:
        ans = str(t)

    while ans_list:
        ans += str(ans_list.pop())

    return ans


if __name__ == '__main__':
    from random import randint

    for _ in range(1024):
        a = randint(10000, 1000000)
        b = randint(100, 10000)
        if sub(str(a), str(b)) != str(a - b):
            print(a, b)

go

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    var reader = bufio.NewReader(os.Stdin)
    var x = readArray(reader)
    var y = readArray(reader)
    fmt.Println(sub(x, y))
}

// 1: x > y
// 0 x == y
//-1 x < y
func checkXY(x, y []int) int {
    if len(x) > len(y) {
        return 1
    } else if len(x) < len(y) {
        return -1
    }
    var i int
    for i < len(x) {
        if x[i] > y[i] {
            return 1
        } else if x[i] < y[i] {
            return -1
        }
        i++
    }
    return 0
}

func sub(x, y []int) string {
    var flag bool
    var code = checkXY(x, y)
    if code == 0 {
        return "0"
    }
    if code == -1 {
        x, y = y, x
        flag = true
    }
    var (
        jw     int
        i      int
        length = len(x)
        ly     = len(y)
        ans    string
        sum    int
    )

    for i < ly {
        sum = x[length-i-1] - y[ly-i-1] - jw
        jw = 0
        if sum < 0 {
            jw = 1
            sum += 10
        }
        ans = strconv.Itoa(sum) + ans
        i++
    }

    for i < length {
        sum = x[length-i-1] - jw
        jw = 0
        if sum < 0 {
            jw = 1
            sum += 10
        }
        ans = strconv.Itoa(sum) + ans
        i++
    }

    for ans[0] == '0' {
        ans = ans[1:]
    }

    if flag {
        ans = "-" + ans
    }
    return ans
}

func readLine(reader *bufio.Reader) string {
    var line, _ = reader.ReadString('\n')
    return strings.TrimRight(line, "\n")
}

func readArray(reader *bufio.Reader) []int {
    var line = readLine(reader)
    var strList = strings.Split(line, "")
    var nums = make([]int, 0)
    var err error
    var v int
    for i := 0; i < len(strList); i++ {
        if v, err = strconv.Atoi(strList[i]); err != nil {
            continue
        }
        nums = append(nums, v)
    }
    return nums
}

乘法

python

# 高精度整数乘整数
def mul(a: str, b: int):
    a_list = [int(c) for c in reversed(list(a))]

    ans_list = list()
    t = 0
    for c in a_list:
        x = ((c * b) + t) % 10
        ans_list.append(str(x))
        t = ((c * b) + t) // 10
    # print(ans_list)
    ans = str()

    if not t:
        while ans_list:
            ta = ans_list.pop()
            if ta == '0':
                continue
            else:
                ans = ta
                break
    else:
        ans = str(t)

    while ans_list:
        ans += ans_list.pop()

    # print(ans)
    return ans


if __name__ == '__main__':
    from random import randint

    for _ in range(1024):
        a = randint(100000, 1000000)
        b = randint(100, 10000)
        if mul(str(a), b) != str(a * b):
            print(a, b)

go

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    var reader = bufio.NewReader(os.Stdin)
    var x = readArray(reader)
    var y, _ = strconv.Atoi(readLine(reader))
    fmt.Println(mul(x, y))
}

func mul(x []int, y int) string {
    if y == 0 || len(x) <= 0 {
        return "0"
    }

    var (
        lx  = len(x)
        ans string
        i   int
        j   int
        jw  int
        sum int
    )

    for i < lx {
        sum = x[lx-i-1]*y + jw
        jw = sum / 10
        ans = strconv.Itoa(sum%10) + ans
        i++
    }
    j++

    if jw > 0 {
        ans = strconv.Itoa(jw) + ans
    }

    return ans
}

func readLine(reader *bufio.Reader) string {
    var line, _ = reader.ReadString('\n')
    return strings.TrimRight(line, "\n")
}

func readArray(reader *bufio.Reader) []int {
    var line = readLine(reader)
    var strList = strings.Split(line, "")
    var nums = make([]int, 0)
    var err error
    var v int
    for i := 0; i < len(strList); i++ {
        if v, err = strconv.Atoi(strList[i]); err != nil {
            continue
        }
        nums = append(nums, v)
    }
    return nums
}

除法

python

# 高精度整数除以整数
def div(a: str, b: int):
    t = 0
    ans_list = list()
    for c in a:
        ans_list.append(str((t * 10 + int(c)) // b))
        t = (t * 10 + int(c)) % b

    ans = str()
    index = 0
    while index < len(ans_list):
        if ans_list[index] == '0':
            index += 1
            continue
        else:
            ans = ans_list[index]
            index += 1
            break

    while index < len(ans_list):
        ans += ans_list[index]
        index += 1
    return ans


if __name__ == '__main__':
    from random import randint

    for _ in range(1024):
        a = randint(100000, 1000000)
        b = randint(100, 10000)
        if div(str(a), b) != str(a // b):
            print(a, b, div(str(a), b), a // b)

go

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    var reader = bufio.NewReader(os.Stdin)
    var x = readArray(reader)
    var y, _ = strconv.Atoi(readLine(reader))
    var a, b = div(x, y)
    fmt.Println(a)
    fmt.Println(b)
}

func div(x []int, y int) (string, int) {

    var (
        lx  = len(x)
        ans string
        i   int
        t   int
        sum int
    )

    for i < lx {
        sum = x[i] + t*10
        ans += strconv.Itoa(sum / y)
        t = sum % y
        i++
    }

    for len(ans) > 1 && ans[0] == '0' {
        ans = ans[1:]
    }

    return ans, t
}

func readLine(reader *bufio.Reader) string {
    var line, _ = reader.ReadString('\n')
    return strings.TrimRight(line, "\n")
}

func readArray(reader *bufio.Reader) []int {
    var line = readLine(reader)
    var strList = strings.Split(line, "")
    var nums = make([]int, 0)
    var err error
    var v int
    for i := 0; i < len(strList); i++ {
        if v, err = strconv.Atoi(strList[i]); err != nil {
            continue
        }
        nums = append(nums, v)
    }
    return nums
}

最后更新于

这有帮助吗?