123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- package main
- import (
- "fmt"
- "strconv"
- )
- // length < 110, non-negative
- func multiply(num1 string, num2 string) string {
- if num1 == "0" || num2 == "0" {
- return "0"
- }
- if num1 == "1" {
- return num2
- } else if num2 == "1" {
- return num1
- }
- n1 := str2IntSlice(num1)
- n2 := str2IntSlice(num2)
- sum := []int{}
- if len(n1) < len(n2) {
- n1, n2 = n2, n1
- }
- for index, num := range n2 {
- product := intSliceMulInt(n1, num)
- zeros := make([]int, len(n2)-1-index)
- product = append(product, zeros...)
- sum = addIntSlice(sum, product)
- }
- return intSlice2Str(sum)
- }
- func str2IntSlice(str string) []int {
- res := []int{}
- for _, char := range str {
- res = append(res, int(char-'0'))
- }
- return res
- }
- func intSlice2Str(slice []int) string {
- str := []rune{}
- for _, i := range slice {
- str = append(str, rune(i+'0'))
- }
- return string(str)
- }
- func addIntSlice(slice1, slice2 []int) []int {
- if len(slice1) < len(slice2) {
- slice1, slice2 = slice2, slice1
- }
- if len(slice2) == 0 || (len(slice2) == 1 && slice2[0] == 0) {
- return slice1
- }
- res := make([]int, len(slice1)+1)
- carry := 0
- for offset := 0; offset < len(slice1); offset++ {
- var digit, digit1, digit2 int
- if offset < len(slice2) {
- digit1 = slice1[len(slice1)-1-offset]
- digit2 = slice2[len(slice2)-1-offset]
- } else if offset < len(slice1) {
- digit1 = slice1[len(slice1)-1-offset]
- digit2 = 0
- } else {
- digit1, digit2 = 0, 0
- }
- digit, carry = addByDigit(digit1, digit2, carry)
- res[len(res)-1-offset] = digit
- }
- if carry == 0 {
- return res[1:]
- }
- res[0] = carry
- return res
- }
- func intSliceMulInt(slice []int, num int) []int {
- if num == 0 || len(slice) == 0 || (len(slice) == 1 && slice[0] == 0) {
- return []int{0}
- }
- if num == 1 {
- return slice
- }
- res := make([]int, len(slice)+1)
- carry := 0
- for offset := 0; offset < len(slice); offset++ {
- digit := slice[len(slice)-1-offset]
- digit, carry = mulByDigit(digit, num, carry)
- res[len(res)-1-offset] = digit
- }
- if carry == 0 {
- return res[1:]
- }
- res[0] = carry
- return res
- }
- func mulByDigit(digit1, digit2, lastCarry int) (digit, carry int) {
- digit = digit1*digit2 + lastCarry
- carry = digit / 10
- return digit % 10, carry
- }
- func addByDigit(digit1, digit2, lastCarry int) (digit, carry int) {
- digit = digit1 + digit2 + lastCarry
- carry = digit / 10
- return digit % 10, carry
- }
- func testMultiply(num1 string, num2 string) {
- n1, _ := strconv.Atoi(num1)
- n2, _ := strconv.Atoi(num2)
- fmt.Printf("%s * %s = %s | %d\n", num1, num2, multiply(num1, num2), n1*n2)
- slice := str2IntSlice("12347876")
- intSlice2Str(slice)
- }
- /* func main() {
- testMultiply("782", "3908982")
- } */
|